Есть программа, которая выполняет выгрузку данных из СУБД.
Это довольно таки продолжительное действие (около 30 мин).
Так вот вопрос:
Как правильно обновлять контролы на форме, во время выгрузки данных ?
Вызывать Application.Processmessege после выгрузки каждой строчки не самое лучшее решение
Хочется услышать более лучшее решение
Заранее спасибо.
Бекинин Дмитрий
Re: Как правильно обновлять форму во время работы программы
Здравствуйте, dumas, Вы писали:
D>Вызывать Application.Processmessege после выгрузки каждой строчки не самое лучшее решение
После каждой строчки — не лучшее решение. Подгадать "после каждых N строчек" — вполне допустимое (N подбирать так, чтобы вызывалось достаточно часто, но не слишком часто — скажем, порядка десяти раз в секунду).
Более правильное, хотя чуть более громоздкое решение — использовать TThread. Основное, что при этом нужно помнить — DB-компоненты в принципе потоковобезопасны, но определенное внимание требуется, в частности, выводить из потока в визуальные компоненты можно только используя Synchronize.
Re[2]: Как правильно обновлять форму во время работы програм
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, dumas, Вы писали:
D>>Вызывать Application.Processmessege после выгрузки каждой строчки не самое лучшее решение
S>После каждой строчки — не лучшее решение. Подгадать "после каждых N строчек" — вполне допустимое (N подбирать так, чтобы вызывалось достаточно часто, но не слишком часто — скажем, порядка десяти раз в секунду).
S>Более правильное, хотя чуть более громоздкое решение — использовать TThread. Основное, что при этом нужно помнить — DB-компоненты в принципе потоковобезопасны, но определенное внимание требуется, в частности, выводить из потока в визуальные компоненты можно только используя Synchronize.
Спасибо за ответ
Наверное использование TThread лучшее решение
Бекинин Дмитрий
Re[3]: Как правильно обновлять форму во время работы програм
Здравствуйте, delphinchik, Вы писали:
D>А по-моему Application.Processmessege вовсе не лучшее решение. Используй Form.Repaint и не нужно будет париться с потоками.
Form.Repaint посылает ссобщение в очередь сообщений windows.
Т.е. не подходит, так как если приложение занято какими-то действиями, то действия в очереди тоже не выполняются
Бекинин Дмитрий
Re[5]: Как правильно обновлять форму во время работы програм
Здравствуйте, delphinchik, Вы писали:
D>Да уж, тут не поспоришь. Во время запросов Repaint не прокатит. А где можно почитать насчет организации многопоточности?
Если говорить о многопоточности как таковой — там нечего писать. Создаешь экземпляр TThread, и он работает. А вот архитектура многопоточных приложений, синхронизация, параллельные вычисления итп — тема толстых книг и курсов. Сходу не назову — по таким вещам нам очень много рассказывали в универе, поэтому читать потом особо не требовалось. Могу посоветовать искать именно теорию — конкретные реализации просты, но в книге, где рассказывается про практику, вряд ли будет толковое изложение принципов.
Re: Как правильно обновлять форму во время работы программы
Здравствуйте, 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: Как правильно обновлять форму во время работы программы
Здравствуйте, dumas, Вы писали:
D>Есть программа, которая выполняет выгрузку данных из СУБД. D>Это довольно таки продолжительное действие (около 30 мин). D>Так вот вопрос: D>Как правильно обновлять контролы на форме, во время выгрузки данных ? D>Вызывать Application.Processmessege после выгрузки каждой строчки не самое лучшее решение
D>Хочется услышать более лучшее решение
Не очень понятно, зачем юзеру присутствовать при столь длительных операциях.
Т.е., если это что-то типа резервного копирования или некоей репликации, то
эти операции д.б. отработаны до такой степени автоматизации, что от юзера(админа)
обычно требуется (даже не требуется) лишь чтение логов.
Если же это некий сбор данных из различных источников + длительный анализ,
то юзеру нет никакого смысла полчаса пялиться на совершенно бесполезную форму.
Т.е., лучше б было запустить некий отдельный процесс, который без пыли и шума
проделает всю необходимую работу, об окончании которой он известит юзера.
Полученные данные могут быть сохранены хоть в локальной БД, так как при подобой
продолжительности операций к актуальности данных надо относится снисходительно.