Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ОЧень медленно читается типизированный файл. В чем ошибка (+) [D5, Win95/98, Win2k]


Борис ©   (2002-10-04 17:03:00) 

Всем привет!

Очень медленно читается типизированный файл (вообще-то это обычный экзешник, или любой ругой файл). Например размером 3 Мб. читается 02 минуты 07 секунд и 370 мс.

Вот исходник:
function TForm1.test(path_file:string; var s:string):cardinal;
var data:array of byte;
i:cardinal;
d:tdatetime;
f : file of byte;
size:cardinal;
begin

AssignFile(f, path_file);
Reset(f);

d:=now;

size:=FileSize(f);
ProgressBar1.Max:=size;

setlength(data,size);

for i:=0 to size-1 do
begin
read(f,data[i]);
application.ProcessMessages;
// ProgressBar1.Position:=i;
end;

// ShowMessage("Вычисляем CRC");
// test:=CalculateCRC32(data[0],Size);

s:=formatdatetime("hh:nn:ss;zzz",now-d);

ProgressBar1.Position:=0;

CloseFile(f);
end;

P.S. Тачка celeron 500 + 256 Mb RAM


KaPaT   (2002-10-05 11:53:00) [1]

> Так BlockRead для нетипизированных файлов, или я ошибаюсь?

BlockRead -для любого типа файлов подойдет...читает заданный размером кусок файла, начиная с указателя...


ЮЮ   (2002-10-05 11:52:00) [2]

1)Ошибка в том, что data - указатель, SizeOf(data)=4, а читать по адресу data вообще нельзя.
2) Reset(f,1);
3) Теперь ты пытаешься прочитать в память всё сразу. Может лучше всё же воспользоваться FileStream-ом ? А в память лучше закачать:
MemoryStream.LoadFromFile


TTCustomDelphiMaster   (2002-10-05 09:39:00) [3]

Не надо обновлять ProgressBar после каждого байта. Обновляйте его после обработки 1% файла.


Борис   (2002-10-05 09:23:00) [4]

Smithson
Так BlockRead для нетипизированных файлов, или я ошибаюсь?
Делаю так:

var data:array of byte;
i:cardinal;
d:tdatetime;
f : file{ of byte};
begin
AssignFile(f, path_file);
Reset(f);
d:=now;
size:=FileSize(f);
ProgressBar1.Max:=size;
setlength(data,size);
BlockRead(f,data,SizeOf(data));

В чем ошибка, и если можно, как исправить?


Anatoly Podgoretsky   (2002-10-04 17:14:00) [5]

Тормозит не Application.ProcessMessages, а по байтовое чтение, вообще очень не рациональный алгоритм.
Проще выделить память под буффер и одной командой Read все прочитать, при том вместо типизированного файла использовать TFileStream, и тогда в зависимости от винчестера от долей секунды до нескольких секунд. Можно и в цикле но большими порциями.


Song   (2002-10-04 17:06:00) [6]

Application.ProcessMessages тормозит цикл


Smithson   (2002-10-04 17:06:00) [7]

Используй BlockRead


Наверх

Титульная страница Поиск, карта сайта Написать письмо