|
Вопрос # 247/ вопрос открыт / |
|
Привет Всем!
Помогите вставить ProgressBar в этот код.
Приложение: Переключить в обычный режим- procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
- var
- s: string;
- AStream: TIDStreamVCL;
- Filename: string;
- FileSize: int64;
- begin
- while AContext.Connection.Connected do
- begin
- s := AContext.Connection.IOHandler.ReadLn;
- if S = 'FILE' then
- begin
- Filename := AContext.Connection.IOHandler.ReadLn; // get filename
- FileSize := StrToInt(AContext.Connection.IOHandler.ReadLn); // get filesize
- ForceDirectories(ExtractFilePath(Paramstr(0)) + 'InServerTCP');
- AStream := TIDStreamVCL.Create(
- TFileStream.Create(ExtractFilePath(Paramstr(0)) + 'InServerTCP'
+ Filename, fmCreate), True);
- Application.ProcessMessages;
- try
-
Memo1.Lines.Add('Ïîëó÷åíèå
ôàéëà [
'+AContext.Connection.Socket.Binding.PeerIP + ' ] " ' + Filename
+ ' "
'+'Îáùèé
ðàçìåð: ' +
BytesToStr(Filesize) + '');
- AContext.Connection.IOHandler.ReadStream(AStream, Filesize, False);
- Application.ProcessMessages;
- Memo1.Lines.Add('C
àäðåññà [
'+AContext.Connection.Socket.Binding.PeerIP + ' ]
Èìÿ
ôàéëà " ' +
Filename + ' "
ïîëó÷åí
!');
- finally
- FreeAndNil(AStream);
- end;
- end
- else if S = 'QUIT' then
- begin
-
Memo1.Lines.Add('Êëèåíò
[ '+AContext.Connection.Socket.Binding.PeerIP + ' ]
îòêëþ÷èëñÿ
!');
- Memo1.SelAttributes.Color := clRed;
- AContext.Connection.Disconnect;
- Application.ProcessMessages;
- end
- else
- begin
- Memo1.Lines.Add(AContext.Connection.Socket.Binding.PeerIP + '
:Íåèçâåñòíàÿ
êîììàíäà:
' + S);
- Memo1.SelAttributes.Color := clRed;
- AContext.Connection.Disconnect;
- AStream.Free;
- end;
- end;
- end;
 |
Вопрос задал: Vit2 (статус: Посетитель)
Вопрос отправлен: 8 января 2007, 21:25
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Переделать следует эту строку
AContext.Connection.IOHandler.ReadStream(AStream, Filesize, False);
Делим наш размер на несколько логических кусков. Думаю на 10 будет предостаточно, но при маленьком размере, можно и уменьшить.
слишком дробить файл не советую, так как это может замедлить работу. В примере я использую блоки по 16кбай.
Код в приложении
P.S. Советую код вынести в поток.
Приложение: Переключить в обычный режим- var i,n,os:integer;
- .....
-
- os:=filesize mod (16*1024);
- ProgressBar1.max:=i+1;
- ProgressBar1.Position:=0;
- for i:=0 to i-1 do
- begin
- AContext.Connection.IOHandler.ReadStream(AStream, 16*1024, False);
- ProgressBar1.Position:=i;
- Application.ProcessMessages;
- end;
-
- AContext.Connection.IOHandler.ReadStream(AStream, os, False);
- ProgressBar1.Position:=ProgressBar1.max;
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 9 января 2007, 17:02
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 11 января 2007, 22:42; участников в обсуждении: 2.
|
Vit2 (статус: Посетитель), 10 января 2007, 13:24 [#1]:
Привет!
В клиентской части прогресс сначало на пару процентов вперёд шол чем на сервере потом выровнялись,на сервере прогресс дошол до 93процента и остановился но файл пришол. Файл 100МБ
|
|
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 (статус: Посетитель), 11 января 2007, 11:58 [#4]:
Привет!
А как это всё хозяйство вынестив в поток?
Подскажите или лучше покажите.Наглядные примеры
лучше познаются.
|
|
Vit2 (статус: Посетитель), 11 января 2007, 22:42 [#5]:
Огромное спасибо Вадим К
Всё нормально заработало, это просто по локальной сети ошибка вылетала.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|