Отображение статуса и ProcessMessage

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Отображение статуса и ProcessMessage

Сообщение tria » 23.09.2018 18:12:03

Есть проект, в котором наличествует основная форма и много вспомогательных.
На основной форме есть StatusBar.
Есть необходимость при длительных процессах показывать ход выполнения в этом StatusBar(просто текст с количеством выполненных действий).
Если не делать ProcessMessage - программа "виснет".
Если делать - пользователь может ткнуть мышкой в кнопки, закрыть форму и т.п. что может привести к фатальным последствиям.
Если на основную форму положить ProgressBar - то проблемы никуда не уходят - если бы ProgressBar лежал на каждой из форм, то еще ладно - он обновляется, но когда он лежит на главной форме, то его обновления не происходит.
Существует ли какое-либо решение?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: Отображение статуса и ProcessMessage

Сообщение Снег Север » 23.09.2018 18:40:03

Запретить закрываться вспомогательным формам (в CloseQuery) до тех пор, как выполнится то, что вам надо.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Отображение статуса и ProcessMessage

Сообщение MysticCoder » 23.09.2018 19:46:19

попробуй этот статусбар перерисовывать после обновления прогресса.
а вообще раз пользователю нельзя что либо делать в это время, то имеет смысл сделать отдельное окно с прогресс баром, которое показывать модально во время длительных процессов.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Отображение статуса и ProcessMessage

Сообщение olegy123 » 23.09.2018 21:45:33

tria писал(а):Если не делать ProcessMessage - программа "виснет".
класически программа однопотоковая, ProcessMessage заставляет обработать все накопленные события(TMessage). Пока главная задача занимается работой, периодически вызывая ProcessMessage - в этот момент внешне программа будет пробуждаться и реагировать.

tria писал(а):Существует ли какое-либо решение?
задействовать многопоточность (TThread).
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Отображение статуса и ProcessMessage

Сообщение zub » 23.09.2018 22:28:46

ты с дуба упал? какая многопоточность?
>>Существует ли какое-либо решение?
Конечно. сделать нормальный гуй с централизованой возможностью дисаблить элементы - например переделав его на экшены.
В первом посте только долько частный случай, запрещать выход и реакцию на гуй может понадобиться не только при прорисовке прогрессбара
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Отображение статуса и ProcessMessage

Сообщение olegy123 » 24.09.2018 03:35:18

zub писал(а):ты с дуба упал? какая многопоточность?

Зуб, нормальная прога никогда использовать Application.ProcessMessages, чтобы оживить программу, не будет. Длительные вычисления лучше переложить в другой поток.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Отображение статуса и ProcessMessage

Сообщение Снег Север » 24.09.2018 08:28:14

olegy123, у топикстартера вспомогательные формы не имеют права закрываться до окончания длительных вычислений. так что будут они в основном потоке или в другом совершенно по-барабану, для пользователя результат един.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Отображение статуса и ProcessMessage

Сообщение serbod » 24.09.2018 08:56:53

Вариант с многопоточностью вместо принудительного ProcessMessages более правильный, но более сложный. Для больших проектов с множеством форм и дата модулей это единственно правильный вариант.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Отображение статуса и ProcessMessage

Сообщение Снег Север » 24.09.2018 09:27:14

Если в проекте множество датамодулей, то это изначально серьезная ошибка проектирования. Датамодуль должен быть ровно один на проект. Многопоточность имеет смысл только в том случае, когда действия в потоках независимы и никак не влияют на гуй. В ином случае нужно вставлять бесконечные циклы с ожиданием синхронизации и смысл потоков пропадает полностью.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Отображение статуса и ProcessMessage

Сообщение zub » 24.09.2018 10:08:23

>>нормальная прога никогда использовать Application.ProcessMessages,
Нормальная прога использует то что уместно для конкретной задачи. В данном случае это ProcessMessages
Многопоточность в данной постановке принесет только геморой, ибо в гуишном потоке ничего не изменится - ты также будешь сидеть и дисаблить кнопочки и прочие свистелки

>>>>нормальная прога никогда использовать Application.ProcessMessages,
Нука расскажи какие будут проблемы если я при висе на 10 сек двадцать раз вызову Application.ProcessMessages?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Отображение статуса и ProcessMessage

Сообщение wadman » 24.09.2018 10:41:38

Я-бы вынес в другой поток и либо с модальным окошком с прогрессбаром, либо при закрытии приложения уведомлял пользователя, к чему это приведет.

С формой наиболее логичный и простой вариант. Не стоит бояться потоков, они не кусаются. 8)
wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

Re: Отображение статуса и ProcessMessage

Сообщение tria » 24.09.2018 10:53:32

Спасибо всем отозвавшимся.
Добавлю информацию о проекте. Что-то похожее на 1С. Количество окон произвольное - сколько захотел открыть пользователь, столько и открылось.
Часть из них владельцем главное, часть - уже открытые.
Я заранее не знаю, долго ли или быстро будут выполняться операции, мелькать каждый раз модальным окошком с ProgressBar некрасиво.
Ваять отдельный поток при проведении документа - это вообще не туда. Всего лишь нужно, чтобы пользователь дождался выполнения действий и видел прогресс выполнения.

Пока что идея такая - перед началом действий для всех окон сделать enable=false, по окончанию - true. В процессе - ProcessMessage.
Из проблематики:
- при старте нужно для всех окон рекурсивно перебрать компоненты, чтобы получить список всех открытых окон (может быть долго)
- при каком-то неотслеженном сбое вся программа останется залоченной.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: Отображение статуса и ProcessMessage

Сообщение wadman » 24.09.2018 11:10:48

tria писал(а):Ваять отдельный поток при проведении документа - это вообще не туда. Всего лишь нужно, чтобы пользователь дождался выполнения действий и видел прогресс выполнения.

Как раз "туда". Поток и убрать можно почти без проблем.
Думаю, что моя обертка-компонент над потоком вполне может пригодиться: https://github.com/wadman/wthread
wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

Re: Отображение статуса и ProcessMessage

Сообщение tria » 24.09.2018 11:20:27

wadman писал(а):Как раз "туда". Поток и убрать можно почти без проблем.

В этом потоке могут корректироваться данные, с которыми пользователь захочет работать в другом окне.
Предположить и отловить заранее все возможные глюки - как минимум рисковано.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: Отображение статуса и ProcessMessage

Сообщение wadman » 24.09.2018 11:22:29

tria писал(а):Предположить и отловить заранее все возможные глюки - как минимум рисковано.

Ну вот и аргумент за модальное окно на время выполнения задачи.
wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: stikriz11 и гости: 38

Рейтинг@Mail.ru