Главная страница
    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.48 MB
Время: 0.007 c
14-34190
Qpwoe!
2002-10-18 07:06
2002.11.11
Как загнать иконку в ТРЕЙ(sytemtray)?


1-34031
Incognito
2002-11-02 02:33
2002.11.11
Работа с файлами


14-34160
^Sanya
2002-10-23 20:30
2002.11.11
Программа по составлению расписания ВУЗа...


3-33900
roben
2002-10-22 05:08
2002.11.11
Вернуть данные из редактирования в Excel


1-34017
gbm
2002-11-01 20:19
2002.11.11
трабл:(





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский