![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ОЧень медленно читается типизированный файл. В чем ошибка (+) [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