Страница 1 из 1

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

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

Lazarus 1.8x64 + Debian9x64
Под Windows пока не проверял, но , подозреваю, будет тоже самое.

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

СообщениеДобавлено: 06.03.2018 13:32:06
serbod
Если внутри потока есть обращения к элементам GUI (полям ввода, таблицам) - то возникает путаница в обработчике системных событий, который рассчитан на основной поток.

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

СообщениеДобавлено: 06.03.2018 13:53:46
olegy123
lordgray писал(а):Чем мешает поток не главным формам, я не понимаю. Как с этим бороться?

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

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

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

если нужно чтобы не активной была главная форма(все другие формы)
то хватить вызвать так FormModal.ShowModal

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

СообщениеДобавлено: 06.03.2018 15:02:49
lordgray
serbod писал(а):Если внутри потока есть обращения к элементам GUI

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

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

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

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

СообщениеДобавлено: 06.03.2018 15:30:19
olegy123
lordgray писал(а): Но причем здесь это, если форма не обрабатывает событие закрытия.


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


Добавлено спустя 2 минуты 13 секунд:
lordgray писал(а):Я именно так и делаю.
если нужно форма, которая бы в момент показа перекрывала родительскую форму и тормозила главный поток
то нужно по другому делать.

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

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


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

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

СообщениеДобавлено: 06.03.2018 15:56:15
lordgray
serbod писал(а):Способов много.
1. TThread.Synchonize()

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

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

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

Ладно, на днях попробую через PostMessage(), потом отпишусь

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

СообщениеДобавлено: 11.03.2018 15:22:55
Python
Посмотрите, не пропал ли ModalResult у кнопки, которой диалог модальный закрываете? У меня как-то пропал, я нервничал, что не работает, тоже кучу способов перепробовал, а оказалось, что всё так просто.

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

СообщениеДобавлено: 11.03.2018 18:08:33
pupsik
lordgray этот пример работает?