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

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

сложный вопрос [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


Наверх

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