![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сложный вопрос [D4, Win95/98]
Ghost! © (2002-10-30 22:00:00)Добрый вечер! Подскажите, пожалуйста, как выйти из такой ситуации:
нужно считывать из файла по символу и тут же по символу записывать в Memo. Использую оператор Repeat. Но машина виснит... Конечно, можно считывать по строке, а последнюю строку по символам, но это мне не подходит. Можно как-нибудь избежать подвисания? Мастера, не подскажете, что делать? Был бы очень благодарен.
Ghost! (2002-10-31 15:18:00) [1]Большое всем спасибо! Все советы мне очень помогли. Кстати, я по дури переменной a тип Byte дал (уже слышу хохот). Так что получился бесконечный цикл. И подозрение оказалось здоровым. Прошу прощения. Ещё раз спасибо.
KSergey (2002-10-31 09:30:00) [2]¤NoNaMe¤ © (30.10.02 22:54)
...
a:=0;
x:=30000;
Memo1.Lines.Add("Start time: "+TimeToStr(Now));
repeat
read(f,c);
inc(a);
Memo1.Text:=Memo1.Text+c;
until a=x;
CloseFile(f);
Memo1.Lines.Add("End time: "+TimeToStr(Now));
Этот код читает 30 000 символов минуты 2 и не виснет.
А в чем заключается зависание
Ну вообще не факт, что зависает. Может просто оочень долго читает. Все-таки счатать 30 тыс. буковок побайтно, да еще каждый раз присваивать их по одному к свойству Memo1.Text - это огого как долго. Попробуйте для начала задать х=5 и посмотреть на результат.
И еще: из приведенного куска не видно какого типа a и х. Есть нездоровое подозрение, что... (ну вы уточните - а там будет понятно - здоровое оно или не здоровое).
SottNick (2002-10-31 06:54:00) [3]а считывать из файла по 1 символу (байту) конечно не дело
читай килобайт по 100
SottNick (2002-10-31 06:42:00) [4]memo скрой перед началом
и покажи после
а лучше
делай все операции вне видуальных компонентов
а потом результаты передай в видуальные
apay (2002-10-31 02:54:00) [5]Зачем читать весь файл?
var
Stream: TFileStream;
Buf: PChar;
...
Stream := TFileStream.Create( "anyfile.txt", fmOpenRead );
GetMem( Buf, x+1 );
Stream.ReadBuffer( Buf, x );
Buf[x] := #0;
Memo1.Text := Buf;
FreeMem( Buf );
Stream.Free;
и никаких гвоздей
¤NoNaMe¤ (2002-10-31 01:15:00) [6]>А можно ли к этому процессу привязать ProgressBar
Можно
...
a:=0;
x:=30000;
ProgressBar1.MAx:=x;
Memo1.Lines.Add("Start time: "+TimeToStr(Now));
repeat
read(f,c);
inc(a);
Memo1.Text:=Memo1.Text+c;
ProgessBar1.Position:=ProgessBar1.Position+1;
Application.ProcessMessages;// Тока с этим еще дольше будет
until a=x;
CloseFile(f);
Memo1.Lines.Add("End time: "+TimeToStr(Now));
А вот так гораздо быстрее читает (файл >700КБ):
....
with TStringList.Create do
begin
LoadFromFile("log.txt");
Memo1.Text:=copy(Text,1,60000);
Free;
end;
Ghost! (2002-10-31 00:52:00) [7]Спасибо большое!
А можно ли к этому процессу привязать ProgressBar или что-то в этом роде? И если можно, то как?
Andryk (2002-10-30 22:57:00) [8]Ну тогда можно написать свой насленкик TSream и спользовать метод Meme1.Lines.LoadFromSream. А в своем Stream не читать больше x символов.
¤NoNaMe¤ (2002-10-30 22:54:00) [9]
...
a:=0;
x:=30000;
Memo1.Lines.Add("Start time: "+TimeToStr(Now));
repeat
read(f,c);
inc(a);
Memo1.Text:=Memo1.Text+c;
until a=x;
CloseFile(f);
Memo1.Lines.Add("End time: "+TimeToStr(Now));
Этот код читает 30 000 символов минуты 2 и не виснет.
А в чем заключается зависание
Ghost! (2002-10-30 22:35:00) [10]нужно скачать только x символов
Andryk (2002-10-30 22:27:00) [11]А не проще ли воспользоваться стандартными средствами
Memo1.Lines.LoadFromFile
Ghost! (2002-10-30 22:23:00) [12]a - сколько символов считанно
x - сколько нужно считать
Да, Begin и End не нужны, но они, по-моему, и не мешают.
Посимвольно, чтоб добывить x символов + в нужный момент остановиться и вписать другой символ (вариант кода, приведённого выше несколько упрощён, но от этого смысл не меняется - виснет и упрощённый тоже).
MBo (2002-10-30 22:15:00) [13]что такое a и x?
зачем begin и end?
по коду не видно, зачем посимвольно добавлять.
чтение из файла обычно организуют так:
while not Eof(f) do begin
Read(f,...);
...
end;
Ghost! (2002-10-30 22:11:00) [14]Так тоже не идёт. А код очень прост:
Repeat
Begin
Read(F, C);
a:=a+1;
Memo1.Text:=Memo1.Text+C;
end;
Until a=x;
MBo (2002-10-30 22:04:00) [15]Считывай все сразу, добавляй в Memo посимвольно.
Почему виснет - без кода ответят только на www.telepat.ru