![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с мегабайтным текстовым файлом [D5, Win95/98, WinXP]
spa © (2002-11-13 14:41:00)Подскажите как узнать количество строк в текстовом файле и в процессе обработки строк из ентого файла показывать ProgressBar с возможностью отмены процесса.(Чтобы программа не замирала безжизненно в ходе выполнения цикла обработки)
spa (2002-11-15 14:09:00) [1]Спасибо всем.
Моя фантазия простерлась только до прорисовки номра обрабатываемой строки из общего их количества. Для этого нужен ProcMess. Если его убрать , то вся отрисовка остается за кадром.
Ну да ладно , при моих объемах установка ProcMes в цикле увеличивает время обработки с 5 мин до 5мин20с.зато усе наглядно.
spa
Геннадий (2002-11-14 16:54:00) [2]
spa © (14.11.02 15:57)
Насчет Целесообразности применения Application.ProcessMessages - есть ли другие способы показать что приложение не висит , а упорно трудится?
У тебя же ProgressBar это показывать будет. Позёт - работает.
А если пофантозировать... то можно на форме разместить какую-нибудь весёлую картинку :) и таймер, который каждую секунду будет изменять для картинки свойство TImage.Visible . Мигает - работает... Как в анекдоте про ментов :))
spa (2002-11-14 16:00:00) [3]Простите , эксперимент показал, что ProgressB отрабатывает и без ProcessMess. и все происходит немного быстрее.
spa (2002-11-14 15:57:00) [4]Спасибо за дискуссию, господа!
Насчет размера файла в кол-ве строк FileSize не покатит , так как в файле нет информации о том сколько раз встречается перевод строки (также как нет информации о том сколько раз встречаются запятые :)) и это не узнать не прочитав файл целиком.
Мне посоветовали поступить так - слить файл в некий фиктивный StringList, затем считать у него Count.
Насчет Целесообразности применения Application.ProcessMessages - есть ли другие способы показать что приложение не висит , а упорно трудится?
F1 (2002-11-13 16:47:00) [5]>Lord Warlock © (13.11.02 16:41)
Так разница в присутствие/отсутствие ProcessMessages или в количестве???
Если в количестве тогда Sorry, виноват, исправлюсь, хотя у меня небыло, честное пионерское!
А если в присутствие/отсутствие, тогда никакова Sorry :), енто же логично!
Lord Warlock (2002-11-13 16:41:00) [6]
> F1 © (13.11.02 16:32)
Замедление есть и весьма существенное. У меня при работе с базой ProcessMessages затормаживал раза в 3.
F1 (2002-11-13 16:32:00) [7]Что-то не понял, ты про что?
Я ведь только сказал, что у меня практически не было ускорения/замедления при изменении количества вызовов ProcessMessages!
Sectey (2002-11-13 15:41:00) [8]>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 15:32:00) [9]Я раньше делал что-то типа такого, только у меня строки сортировались, и замедление с ProcessMessages примерно на 25% независимо от количества вызовов ProcessMessages, он ведь всю очередь отрабатывает, так что Sectey © (13.11.02 15:18) зря со
мной согласился частично :)
F1 (2002-11-13 15:23:00) [10]>Sectey © (13.11.02 15:18)
Я ведь упрощенно показал.
А вообще ProgressBar прорисовывается без ProcessMessages.
ProcessMessages нужен только для того, чтобы юзер мог пимпы жамкать :)
>spa © (13.11.02 15:16)
Почтай про Application.ProcessMessages в Helpe;
Sectey (2002-11-13 15:18:00) [11]>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;
spa (2002-11-13 15:16:00) [12]спасибо за ответы
Smithson - поищу потщательнее
F1 уточни, пункт 4 - это чтобы программа в цикле не замирала на экране?
F1 (2002-11-13 14:54:00) [13]Наверное вот так:
1) Узнаешь размер файла FileSize
2) после каждой считанной строки узнаешь FilePos
3) Двигаешь ProgressBar в соответствии с 1) и 2)
4) Application.ProcessMessages;
5) If fagStop then Exit;
FlagStop - глоб.перем., которая устанавливается в true при нажатии на кнопку отмена.
Smithson (2002-11-13 14:48:00) [14]Этот вопрос (дословно) был здесь месяца два-три назад. Ищи