| 
| 
 | Вопрос # 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 dobeginAContext.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]:Огромное спасибо Вадим К Всё нормально заработало, это просто по локальной сети ошибка вылетала.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |