Как правильно обновлять форму во время работы программы
От: dumas Украина bekinin.by.ru
Дата: 19.11.04 07:26
Оценка:
Есть программа, которая выполняет выгрузку данных из СУБД.
Это довольно таки продолжительное действие (около 30 мин).
Так вот вопрос:
Как правильно обновлять контролы на форме, во время выгрузки данных ?
Вызывать Application.Processmessege после выгрузки каждой строчки не самое лучшее решение

Хочется услышать более лучшее решение

Заранее спасибо.
Бекинин Дмитрий
Re: Как правильно обновлять форму во время работы программы
От: Softwarer http://softwarer.ru
Дата: 19.11.04 07:38
Оценка: +2
Здравствуйте, dumas, Вы писали:

D>Вызывать Application.Processmessege после выгрузки каждой строчки не самое лучшее решение


После каждой строчки — не лучшее решение. Подгадать "после каждых N строчек" — вполне допустимое (N подбирать так, чтобы вызывалось достаточно часто, но не слишком часто — скажем, порядка десяти раз в секунду).

Более правильное, хотя чуть более громоздкое решение — использовать TThread. Основное, что при этом нужно помнить — DB-компоненты в принципе потоковобезопасны, но определенное внимание требуется, в частности, выводить из потока в визуальные компоненты можно только используя Synchronize.
Re[2]: Как правильно обновлять форму во время работы програм
От: dumas Украина bekinin.by.ru
Дата: 19.11.04 07:46
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, dumas, Вы писали:


D>>Вызывать Application.Processmessege после выгрузки каждой строчки не самое лучшее решение


S>После каждой строчки — не лучшее решение. Подгадать "после каждых N строчек" — вполне допустимое (N подбирать так, чтобы вызывалось достаточно часто, но не слишком часто — скажем, порядка десяти раз в секунду).


S>Более правильное, хотя чуть более громоздкое решение — использовать TThread. Основное, что при этом нужно помнить — DB-компоненты в принципе потоковобезопасны, но определенное внимание требуется, в частности, выводить из потока в визуальные компоненты можно только используя Synchronize.


Спасибо за ответ
Наверное использование TThread лучшее решение
Бекинин Дмитрий
Re[3]: Как правильно обновлять форму во время работы програм
От: delphinchik Россия  
Дата: 19.11.04 10:49
Оценка:
А по-моему Application.Processmessege вовсе не лучшее решение. Используй Form.Repaint и не нужно будет париться с потоками.
Re[4]: Как правильно обновлять форму во время работы програм
От: dumas Украина bekinin.by.ru
Дата: 19.11.04 11:17
Оценка:
Здравствуйте, delphinchik, Вы писали:

D>А по-моему Application.Processmessege вовсе не лучшее решение. Используй Form.Repaint и не нужно будет париться с потоками.


Form.Repaint посылает ссобщение в очередь сообщений windows.
Т.е. не подходит, так как если приложение занято какими-то действиями, то действия в очереди тоже не выполняются
Бекинин Дмитрий
Re[5]: Как правильно обновлять форму во время работы програм
От: delphinchik Россия  
Дата: 19.11.04 11:28
Оценка:
Да уж, тут не поспоришь. Во время запросов Repaint не прокатит. А где можно почитать насчет организации многопоточности?
Re[6]: Как правильно обновлять форму во время работы програм
От: Softwarer http://softwarer.ru
Дата: 19.11.04 12:22
Оценка:
Здравствуйте, delphinchik, Вы писали:

D>Да уж, тут не поспоришь. Во время запросов Repaint не прокатит. А где можно почитать насчет организации многопоточности?


Если говорить о многопоточности как таковой — там нечего писать. Создаешь экземпляр TThread, и он работает. А вот архитектура многопоточных приложений, синхронизация, параллельные вычисления итп — тема толстых книг и курсов. Сходу не назову — по таким вещам нам очень много рассказывали в универе, поэтому читать потом особо не требовалось. Могу посоветовать искать именно теорию — конкретные реализации просты, но в книге, где рассказывается про практику, вряд ли будет толковое изложение принципов.
Re: Как правильно обновлять форму во время работы программы
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.11.04 15:32
Оценка:
Здравствуйте, dumas, Вы писали:
D>Как правильно обновлять контролы на форме, во время выгрузки данных ?
D>Вызывать Application.Processmessege после выгрузки каждой строчки не самое лучшее решение
Вставь после выгрузки каждой строчки примерно такой код:
if LastProcessingTime+Interval>GetTickCount
then begin
    Application.ProcessMessages;
  LastProcessingTime:=GetTickCount;
end;


Interval установи во что-нибудь порядка тыщи. Это заставит интерфейс просыпаться раз в секунду — точнее подбери экспериментально. Таким образом, ты обеспечишь возможность (например) отмены и апдейт прогресса более-менее независимо от производительности аппаратуры. Можно и почаще дергать, если времени не жалко — но не рекомендую ставить интервал менее 100 миллисекунд.

З.Ы. Этот способ плох (по сравнению с отдельным потоком) тем, что хитрый юзер заморозит программу просто взявшись мышой за капшн формы. Впрочем, огромное количество виндовс-программ, написанных вполне уважаемыми людьми, ведут себя именно так.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Как правильно обновлять форму во время работы программы
От: Leonid Troyanovsky  
Дата: 20.11.04 10:52
Оценка:
Здравствуйте, dumas, Вы писали:

D>Есть программа, которая выполняет выгрузку данных из СУБД.

D>Это довольно таки продолжительное действие (около 30 мин).
D>Так вот вопрос:
D>Как правильно обновлять контролы на форме, во время выгрузки данных ?
D>Вызывать Application.Processmessege после выгрузки каждой строчки не самое лучшее решение

D>Хочется услышать более лучшее решение


Не очень понятно, зачем юзеру присутствовать при столь длительных операциях.
Т.е., если это что-то типа резервного копирования или некоей репликации, то
эти операции д.б. отработаны до такой степени автоматизации, что от юзера(админа)
обычно требуется (даже не требуется) лишь чтение логов.

Если же это некий сбор данных из различных источников + длительный анализ,
то юзеру нет никакого смысла полчаса пялиться на совершенно бесполезную форму.
Т.е., лучше б было запустить некий отдельный процесс, который без пыли и шума
проделает всю необходимую работу, об окончании которой он известит юзера.
Полученные данные могут быть сохранены хоть в локальной БД, так как при подобой
продолжительности операций к актуальности данных надо относится снисходительно.
--
С уважением, LVT
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.