Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 247

Раздел: Delphi » Прочее
/ вопрос открыт /

Привет Всем!
Помогите вставить ProgressBar в этот код.

Приложение:
  1. procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
  2. var
  3. s: string;
  4. AStream: TIDStreamVCL;
  5. Filename: string;
  6. FileSize: int64;
  7. begin
  8. while AContext.Connection.Connected do
  9. begin
  10. s := AContext.Connection.IOHandler.ReadLn;
  11. if S = 'FILE' then
  12. begin
  13. Filename := AContext.Connection.IOHandler.ReadLn; // get filename
  14. FileSize := StrToInt(AContext.Connection.IOHandler.ReadLn); // get filesize
  15. ForceDirectories(ExtractFilePath(Paramstr(0)) + 'InServerTCP');
  16. AStream := TIDStreamVCL.Create(
  17. TFileStream.Create(ExtractFilePath(Paramstr(0)) + 'InServerTCP' + Filename, fmCreate), True);
  18. Application.ProcessMessages;
  19. try
  20. Memo1.Lines.Add('Ïîëó÷åíèå ôàéëà [ '+AContext.Connection.Socket.Binding.PeerIP + ' ] " ' + Filename + ' " '+'Îáùèé ðàçìåð: ' + BytesToStr(Filesize) + '');
  21. AContext.Connection.IOHandler.ReadStream(AStream, Filesize, False);
  22. Application.ProcessMessages;
  23. Memo1.Lines.Add('C àäðåññà [ '+AContext.Connection.Socket.Binding.PeerIP + ' ] Èìÿ ôàéëà " ' + Filename + ' " ïîëó÷åí !');
  24. finally
  25. FreeAndNil(AStream);
  26. end;
  27. end
  28. else if S = 'QUIT' then
  29. begin
  30. Memo1.Lines.Add('Êëèåíò [ '+AContext.Connection.Socket.Binding.PeerIP + ' ] îòêëþ÷èëñÿ !');
  31. Memo1.SelAttributes.Color := clRed;
  32. AContext.Connection.Disconnect;
  33. Application.ProcessMessages;
  34. end
  35. else
  36. begin
  37. Memo1.Lines.Add(AContext.Connection.Socket.Binding.PeerIP + ' :Íåèçâåñòíàÿ êîììàíäà: ' + S);
  38. Memo1.SelAttributes.Color := clRed;
  39. AContext.Connection.Disconnect;
  40. AStream.Free;
  41. end;
  42. end;
  43. end;


Vit2 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Vit2 (статус: Посетитель)
Вопрос отправлен: 8 января 2007, 21:25
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Переделать следует эту строку
AContext.Connection.IOHandler.ReadStream(AStream, Filesize, False);

Делим наш размер на несколько логических кусков. Думаю на 10 будет предостаточно, но при маленьком размере, можно и уменьшить.
слишком дробить файл не советую, так как это может замедлить работу. В примере я использую блоки по 16кбай.
Код в приложении
P.S. Советую код вынести в поток.

Приложение:
  1. var i,n,os:integer;
  2. .....
  3.  
  4. os:=filesize mod (16*1024);
  5. ProgressBar1.max:=i+1;
  6. ProgressBar1.Position:=0;
  7. for i:=0 to i-1 do
  8. begin
  9. AContext.Connection.IOHandler.ReadStream(AStream, 16*1024, False);
  10. ProgressBar1.Position:=i;
  11. Application.ProcessMessages;
  12. end;
  13.  
  14. AContext.Connection.IOHandler.ReadStream(AStream, os, False);
  15. ProgressBar1.Position:=ProgressBar1.max;


Ответ отправил: Вадим К (статус: Академик)
Время отправки: 9 января 2007, 17:02
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 11 января 2007, 22:42; участников в обсуждении: 2.
Vit2

Vit2 (статус: Посетитель), 10 января 2007, 13:24 [#1]:

Привет!
В клиентской части прогресс сначало на пару процентов вперёд шол чем на сервере потом выровнялись,на сервере прогресс дошол до 93процента и остановился но файл пришол. Файл 100МБ
Vit2

Vit2 (статус: Посетитель), 10 января 2007, 13:31 [#2]:

Я поставил так i:=FileSize div (15*1024);
При 16ти прогресс на сервере опаздывает и клиент отключается.Или я ваш код не правильно добавил
Вадим К

Вадим К (статус: Академик), 10 января 2007, 14:47 [#3]:

прогресс может опаздывать/спешить чучуть, так как мы на клиенте отображаем квановано (кусками), а реализацию на сервере я не знаю.
Думаю, глюк происходит так. Размер остатка при блоке в 16 к равен 0 (если файл в точности 100м). При блоке в 15 остаток не равен 0 (равен 5)
Теперь, при запросе остатка в первом случае происходит запрос на получение 0 байт, но данных уже нет - файл то уже принят. У Indy наверное от этого рвёт крышу и розрывает соединения.
P.S. 16к для 100М файла - маловато - реальная скорость упадёт.просто прикиньте, что Progressbar будет иметь 6400 делений. Учитывая то, что при каждом изменении позиции он себя пересоздаёт (это не глюк делфи, это виндозный) то тормозит заметно. А разницу между 102 и 103 делением не заметите. Что бы она была заметна, нужно что бы ProgressBar1.Width>6400, А таких дисплеев я ещё не видел:)
Галочка "подтверждения прочтения" - вселенское зло.
Vit2

Vit2 (статус: Посетитель), 11 января 2007, 11:58 [#4]:

Привет!
А как это всё хозяйство вынестив в поток?
Подскажите или лучше покажите.Наглядные примеры
лучше познаются.
Vit2

Vit2 (статус: Посетитель), 11 января 2007, 22:42 [#5]:

Огромное спасибо Вадим К
Всё нормально заработало, это просто по локальной сети ошибка вылетала.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.02 сек.