При активном потоке, не закрываются формы

Общие вопросы программирования, алгоритмы и т.п.

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

При активном потоке, не закрываются формы

Сообщение lordgray » 06.03.2018 11:33:17

Здравствуйте! Проблема такая: при запуске программы, из главной формы стартует поток, который занимается обновлением базы данных. При закрытии главной формы, поток останавливается, все ОК. Но если из главной формы вызвать модально другую форму, то она не закрывается, при нажатии на "Отмена", "Закрыть" просто ничего не происходит. Чем мешает поток не главным формам, я не понимаю. Как с этим бороться?

Lazarus 1.8x64 + Debian9x64
Под Windows пока не проверял, но , подозреваю, будет тоже самое.
lordgray
новенький
 
Сообщения: 55
Зарегистрирован: 10.10.2010 00:19:11

Re: При активном потоке, не закрываются формы

Сообщение serbod » 06.03.2018 13:32:06

Если внутри потока есть обращения к элементам GUI (полям ввода, таблицам) - то возникает путаница в обработчике системных событий, который рассчитан на основной поток.
Аватара пользователя
serbod
постоялец
 
Сообщения: 321
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: При активном потоке, не закрываются формы

Сообщение olegy123 » 06.03.2018 13:53:46

lordgray писал(а):Чем мешает поток не главным формам, я не понимаю. Как с этим бороться?

это тянется с времен когда озу хватало 640кб,а многозадачность существовала только в майнфремах.. и все сводилось в одно окно-одно приложение.
не проще модальное окно открывать не как как
Application.CreateForm(TFormModal, FormModal);
а как
FormModal:=TFormModal.create(nil);

Добавлено спустя 2 минуты 10 секунд:
тогда переменная FormModal у вас в руках будет.
а не где то там в Application эксепшены выдавать.

Добавлено спустя 4 минуты 28 секунд:
FormModal.Show - форма видна

если нужно чтобы не активной была главная форма(все другие формы)
то хватить вызвать так FormModal.ShowModal
olegy123
энтузиаст
 
Сообщения: 989
Зарегистрирован: 25.02.2016 12:10:20

Re: При активном потоке, не закрываются формы

Сообщение lordgray » 06.03.2018 15:02:49

serbod писал(а):Если внутри потока есть обращения к элементам GUI

Есть, но только к главному окну (вывожу состояние в StatusBar)
Если вообще нельзя ни к каким GUI обращаться, то как выводить состояние потока? Через сообщения окна?

olegy123 писал(а):то хватить вызвать так FormModal.ShowModal

Я именно так и делаю. Но причем здесь это, если форма не обрабатывает событие закрытия.
lordgray
новенький
 
Сообщения: 55
Зарегистрирован: 10.10.2010 00:19:11

Re: При активном потоке, не закрываются формы

Сообщение olegy123 » 06.03.2018 15:30:19

lordgray писал(а): Но причем здесь это, если форма не обрабатывает событие закрытия.


Код: Выделить всё
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  CloseAction:=caFree;
end;


Добавлено спустя 2 минуты 13 секунд:
lordgray писал(а):Я именно так и делаю.
если нужно форма, которая бы в момент показа перекрывала родительскую форму и тормозила главный поток
то нужно по другому делать.
olegy123
энтузиаст
 
Сообщения: 989
Зарегистрирован: 25.02.2016 12:10:20

Re: При активном потоке, не закрываются формы

Сообщение serbod » 06.03.2018 15:39:51

lordgray писал(а):Если вообще нельзя ни к каким GUI обращаться, то как выводить состояние потока? Через сообщения окна?


Способов много.
1. TThread.Synchonize()
2. PostMessage()
3. Через публичную thread-safe переменную или объект с TCriticalSection. В основном потоке опрашивать значение по обычному таймеру TTimer.
4. Через thread-safe очередь сообщений.
5. Через системные объекты, специально для обмена между потоками и приложениями - NamedPipes, Sockets, SharedMemory, temporary file handle, итд..
6. Есть куча библиотек для потокобезопасного обмена на любой вкус
Аватара пользователя
serbod
постоялец
 
Сообщения: 321
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: При активном потоке, не закрываются формы

Сообщение lordgray » 06.03.2018 15:56:15

serbod писал(а):Способов много.
1. TThread.Synchonize()

Через него и делаю

olegy123 писал(а):Код: Выделить всё
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
CloseAction:=caFree;
end;

Это все хорошо, но используется не для диалоговых форм. Без потока все работает как надо уже 7 лет.

Ладно, на днях попробую через PostMessage(), потом отпишусь
lordgray
новенький
 
Сообщения: 55
Зарегистрирован: 10.10.2010 00:19:11

Re: При активном потоке, не закрываются формы

Сообщение Python » 11.03.2018 15:22:55

Посмотрите, не пропал ли ModalResult у кнопки, которой диалог модальный закрываете? У меня как-то пропал, я нервничал, что не работает, тоже кучу способов перепробовал, а оказалось, что всё так просто.
Python
новенький
 
Сообщения: 16
Зарегистрирован: 23.01.2018 21:50:17

Re: При активном потоке, не закрываются формы

Сообщение pupsik » 11.03.2018 18:08:33

lordgray этот пример работает?
Вложения
thread_status.7z
(59.78 КБ) Скачиваний: 28
pupsik
энтузиаст
 
Сообщения: 1119
Зарегистрирован: 20.08.2014 16:20:13


Вернуться в Общее

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru