Текущий архив: 2002.11.11;
Скачать: CL | DM;
Внизсложный вопрос Найти похожие ветки
← →
Ghost! (2002-10-30 22:00) [0]Добрый вечер! Подскажите, пожалуйста, как выйти из такой ситуации:
нужно считывать из файла по символу и тут же по символу записывать в Memo. Использую оператор Repeat. Но машина виснит... Конечно, можно считывать по строке, а последнюю строку по символам, но это мне не подходит. Можно как-нибудь избежать подвисания? Мастера, не подскажете, что делать? Был бы очень благодарен.
← →
MBo (2002-10-30 22:04) [1]Считывай все сразу, добавляй в Memo посимвольно.
Почему виснет - без кода ответят только на www.telepat.ru
← →
Ghost! (2002-10-30 22:11) [2]Так тоже не идёт. А код очень прост:
Repeat
Begin
Read(F, C);
a:=a+1;
Memo1.Text:=Memo1.Text+C;
end;
Until a=x;
← →
MBo (2002-10-30 22:15) [3]что такое a и x?
зачем begin и end?
по коду не видно, зачем посимвольно добавлять.
чтение из файла обычно организуют так:
while not Eof(f) do begin
Read(f,...);
...
end;
← →
Ghost! (2002-10-30 22:23) [4]a - сколько символов считанно
x - сколько нужно считать
Да, Begin и End не нужны, но они, по-моему, и не мешают.
Посимвольно, чтоб добывить x символов + в нужный момент остановиться и вписать другой символ (вариант кода, приведённого выше несколько упрощён, но от этого смысл не меняется - виснет и упрощённый тоже).
← →
Andryk (2002-10-30 22:27) [5]А не проще ли воспользоваться стандартными средствами
Memo1.Lines.LoadFromFile
← →
Ghost! (2002-10-30 22:35) [6]нужно скачать только x символов
← →
¤NoNaMe¤ (2002-10-30 22:54) [7]
...
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 и не виснет.
А в чем заключается зависание
← →
Andryk (2002-10-30 22:57) [8]Ну тогда можно написать свой насленкик TSream и спользовать метод Meme1.Lines.LoadFromSream. А в своем Stream не читать больше x символов.
← →
Ghost! (2002-10-31 00:52) [9]Спасибо большое!
А можно ли к этому процессу привязать ProgressBar или что-то в этом роде? И если можно, то как?
← →
¤NoNaMe¤ (2002-10-31 01:15) [10]>А можно ли к этому процессу привязать 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;
← →
apay (2002-10-31 02:54) [11]Зачем читать весь файл?
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;
и никаких гвоздей
← →
SottNick (2002-10-31 06:42) [12]memo скрой перед началом
и покажи после
а лучше
делай все операции вне видуальных компонентов
а потом результаты передай в видуальные
← →
SottNick (2002-10-31 06:54) [13]а считывать из файла по 1 символу (байту) конечно не дело
читай килобайт по 100
← →
KSergey (2002-10-31 09:30) [14]¤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 и х. Есть нездоровое подозрение, что... (ну вы уточните - а там будет понятно - здоровое оно или не здоровое).
← →
Ghost! (2002-10-31 15:18) [15]Большое всем спасибо! Все советы мне очень помогли. Кстати, я по дури переменной a тип Byte дал (уже слышу хохот). Так что получился бесконечный цикл. И подозрение оказалось здоровым. Прошу прощения. Ещё раз спасибо.
Страницы: 1 вся ветка
Текущий архив: 2002.11.11;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.007 c