Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.25;
Скачать: CL | DM;

Вниз

Работа с мегабайтным текстовым файлом   Найти похожие ветки 

 
spa ©   (2002-11-13 14:41) [0]

Подскажите как узнать количество строк в текстовом файле и в процессе обработки строк из ентого файла показывать ProgressBar с возможностью отмены процесса.(Чтобы программа не замирала безжизненно в ходе выполнения цикла обработки)


 
Smithson ©   (2002-11-13 14:48) [1]

Этот вопрос (дословно) был здесь месяца два-три назад. Ищи


 
F1 ©   (2002-11-13 14:54) [2]

Наверное вот так:

1) Узнаешь размер файла FileSize
2) после каждой считанной строки узнаешь FilePos
3) Двигаешь ProgressBar в соответствии с 1) и 2)
4) Application.ProcessMessages;
5) If fagStop then Exit;

FlagStop - глоб.перем., которая устанавливается в true при нажатии на кнопку отмена.


 
spa ©   (2002-11-13 15:16) [3]

спасибо за ответы
Smithson - поищу потщательнее
F1 уточни, пункт 4 - это чтобы программа в цикле не замирала на экране?


 
Sectey ©   (2002-11-13 15:18) [4]

>spa © (13.11.02 14:41)
А начерта тебе считать строки. у тебя что нагрузки при работе со строками мало.

Частично согласен с F1, но только частично.
1М(размер файла) / 256(примерная длина одной строки) ~ 4194304 вызовов Application.ProcessMessages да программа не повиснет но в НЕСКОЛЬКО раз увеличится процес работы.

Spa тебе нужно чтобы ЧЕЛОВЕКИ видели что не все умерло.


var
size,c : integer;
...
begin
size := размер файла;
c := 0;
ProgressBar.Max := ProgressBar.Width;
ProgressBar.Position := 0;

...

c := MulDiv(ProgressBar.Max,текущая позиция, size);
if с <> ProgressBar.Position then
begin
ProgressBar.Position := c;
Application.ProcessMessages;
end;

...
end;


 
F1 ©   (2002-11-13 15:23) [5]

>Sectey © (13.11.02 15:18)
Я ведь упрощенно показал.
А вообще ProgressBar прорисовывается без ProcessMessages.
ProcessMessages нужен только для того, чтобы юзер мог пимпы жамкать :)

>spa © (13.11.02 15:16)
Почтай про Application.ProcessMessages в Helpe;


 
F1 ©   (2002-11-13 15:32) [6]

Я раньше делал что-то типа такого, только у меня строки сортировались, и замедление с ProcessMessages примерно на 25% независимо от количества вызовов ProcessMessages, он ведь всю очередь отрабатывает, так что Sectey © (13.11.02 15:18) зря со
мной согласился частично :)


 
Sectey ©   (2002-11-13 15:41) [7]

>F1 © (13.11.02 15:32)

procedure TProgressBar.SetPosition(Value: Integer);
begin
if not F32BitMode and ((Value < 0) or (Value > Limit16)) then
ProgressLimitError;
if HandleAllocated then SendMessage(Handle, PBM_SETPOS, Value, 0)
else FPosition := Value;
end;

или

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end
else
FTerminate := True;
end;
end;

Не вдоваясь в подробность Что больше ?


 
F1 ©   (2002-11-13 16:32) [8]

Что-то не понял, ты про что?
Я ведь только сказал, что у меня практически не было ускорения/замедления при изменении количества вызовов ProcessMessages!


 
Lord Warlock ©   (2002-11-13 16:41) [9]


> F1 © (13.11.02 16:32)


Замедление есть и весьма существенное. У меня при работе с базой ProcessMessages затормаживал раза в 3.


 
F1 ©   (2002-11-13 16:47) [10]

>Lord Warlock © (13.11.02 16:41)
Так разница в присутствие/отсутствие ProcessMessages или в количестве???
Если в количестве тогда Sorry, виноват, исправлюсь, хотя у меня небыло, честное пионерское!
А если в присутствие/отсутствие, тогда никакова Sorry :), енто же логично!


 
spa ©   (2002-11-14 15:57) [11]

Спасибо за дискуссию, господа!
Насчет размера файла в кол-ве строк FileSize не покатит , так как в файле нет информации о том сколько раз встречается перевод строки (также как нет информации о том сколько раз встречаются запятые :)) и это не узнать не прочитав файл целиком.
Мне посоветовали поступить так - слить файл в некий фиктивный StringList, затем считать у него Count.
Насчет Целесообразности применения Application.ProcessMessages - есть ли другие способы показать что приложение не висит , а упорно трудится?


 
spa ©   (2002-11-14 16:00) [12]

Простите , эксперимент показал, что ProgressB отрабатывает и без ProcessMess. и все происходит немного быстрее.


 
Геннадий ©   (2002-11-14 16:54) [13]


spa © (14.11.02 15:57)

Насчет Целесообразности применения Application.ProcessMessages - есть ли другие способы показать что приложение не висит , а упорно трудится?



У тебя же ProgressBar это показывать будет. Позёт - работает.

А если пофантозировать... то можно на форме разместить какую-нибудь весёлую картинку :) и таймер, который каждую секунду будет изменять для картинки свойство TImage.Visible . Мигает - работает... Как в анекдоте про ментов :))


 
spa ©   (2002-11-15 14:09) [14]

Спасибо всем.
Моя фантазия простерлась только до прорисовки номра обрабатываемой строки из общего их количества. Для этого нужен ProcMess. Если его убрать , то вся отрисовка остается за кадром.
Ну да ладно , при моих объемах установка ProcMes в цикле увеличивает время обработки с 5 мин до 5мин20с.зато усе наглядно.
spa



Страницы: 1 вся ветка

Текущий архив: 2002.11.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
14-82975
The_Vizit0r!
2002-11-07 01:01
2002.11.25
Помогите найти компонент


1-82836
3asys
2002-11-10 20:40
2002.11.25
Конвертация DOC или PDF в графику


14-82947
Пиноккио
2002-11-05 21:33
2002.11.25
Помогите - NAN


3-82683
Progr@mist
2002-11-03 12:05
2002.11.25
Невидимость полей


1-82781
Sectey
2002-11-13 14:49
2002.11.25
Явно правельный код, с совершенно не явным смыслом.