При активном потоке, не закрываются формы
Модератор: Модераторы
При активном потоке, не закрываются формы
Здравствуйте! Проблема такая: при запуске программы, из главной формы стартует поток, который занимается обновлением базы данных. При закрытии главной формы, поток останавливается, все ОК. Но если из главной формы вызвать модально другую форму, то она не закрывается, при нажатии на "Отмена", "Закрыть" просто ничего не происходит. Чем мешает поток не главным формам, я не понимаю. Как с этим бороться?
Lazarus 1.8x64 + Debian9x64
Под Windows пока не проверял, но , подозреваю, будет тоже самое.
Lazarus 1.8x64 + Debian9x64
Под Windows пока не проверял, но , подозреваю, будет тоже самое.
lordgray писал(а):Чем мешает поток не главным формам, я не понимаю. Как с этим бороться?
это тянется с времен когда озу хватало 640кб,а многозадачность существовала только в майнфремах.. и все сводилось в одно окно-одно приложение.
не проще модальное окно открывать не как как
Application.CreateForm(TFormModal, FormModal);
а как
FormModal:=TFormModal.create(nil);
Добавлено спустя 2 минуты 10 секунд:
тогда переменная FormModal у вас в руках будет.
а не где то там в Application эксепшены выдавать.
Добавлено спустя 4 минуты 28 секунд:
FormModal.Show - форма видна
если нужно чтобы не активной была главная форма(все другие формы)
то хватить вызвать так FormModal.ShowModal
serbod писал(а):Если внутри потока есть обращения к элементам GUI
Есть, но только к главному окну (вывожу состояние в StatusBar)
Если вообще нельзя ни к каким GUI обращаться, то как выводить состояние потока? Через сообщения окна?
olegy123 писал(а):то хватить вызвать так FormModal.ShowModal
Я именно так и делаю. Но причем здесь это, если форма не обрабатывает событие закрытия.
lordgray писал(а): Но причем здесь это, если форма не обрабатывает событие закрытия.
Код: Выделить всё
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
CloseAction:=caFree;
end;Добавлено спустя 2 минуты 13 секунд:
если нужно форма, которая бы в момент показа перекрывала родительскую форму и тормозила главный потокlordgray писал(а):Я именно так и делаю.
то нужно по другому делать.
- serbod
- постоялец
- Сообщения: 449
- Зарегистрирован: 16.09.2016 10:03:02
- Откуда: Минск
- Контактная информация:
lordgray писал(а):Если вообще нельзя ни к каким GUI обращаться, то как выводить состояние потока? Через сообщения окна?
Способов много.
1. TThread.Synchonize()
2. PostMessage()
3. Через публичную thread-safe переменную или объект с TCriticalSection. В основном потоке опрашивать значение по обычному таймеру TTimer.
4. Через thread-safe очередь сообщений.
5. Через системные объекты, специально для обмена между потоками и приложениями - NamedPipes, Sockets, SharedMemory, temporary file handle, итд..
6. Есть куча библиотек для потокобезопасного обмена на любой вкус
serbod писал(а):Способов много.
1. TThread.Synchonize()
Через него и делаю
olegy123 писал(а):Код: Выделить всё
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
CloseAction:=caFree;
end;
Это все хорошо, но используется не для диалоговых форм. Без потока все работает как надо уже 7 лет.
Ладно, на днях попробую через PostMessage(), потом отпишусь
Посмотрите, не пропал ли ModalResult у кнопки, которой диалог модальный закрываете? У меня как-то пропал, я нервничал, что не работает, тоже кучу способов перепробовал, а оказалось, что всё так просто.
lordgray этот пример работает?
- Вложения
-
- thread_status.7z
- (59.78 КБ) 593 скачивания
