Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-82910
MixerPro
2002-11-05 08:32
2002.11.25
Начинаю писать на IBase


1-82794
Live_Aus_Berlin
2002-11-13 16:27
2002.11.25
У кого нибудь есть исходники проги, которая считает производные


1-82751
Lina
2002-11-15 10:45
2002.11.25
Может у кого есть доки по созданию ActiveX EXE серверов ?


3-82591
Beglec
2002-11-05 02:51
2002.11.25
SQL - Индексы


8-82877
GIL
2002-08-03 04:47
2002.11.25
как создать параллельный процесс без использования TTimer





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский