Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.019 c
4-34313
Yus
2002-10-03 05:43
2002.11.11
Игровой порт


3-33911
maxim2
2002-10-23 08:05
2002.11.11
Перенос базы из Delphi6 в Kylix2


3-33862
maras
2002-10-22 10:05
2002.11.11
Контекстный поиск в таблице


6-34154
Metallica
2002-09-07 18:18
2002.11.11
Как проверить существование страницы в интернет, используя NMHTTP


1-34086
Igorek
2002-10-24 13:45
2002.11.11
Стиль: Вызов виртуальных методов из деструкторов