Форум: "Основная";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
ВнизРабота с мегабайтным текстовым файлом Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c