Задача какая. Я думаю все знают, что если вызвать какое-то виндовое модальное окно или диалог, то система как бы "уводит" основной цикл на работу этого диалога, что приводит к безответной реакции окна-владельца.
В общем при сохранении файла я использую GeSavetFileName. Соответственно основная программа перестает отвечать на посланные команды, пока процесс модального окна не завершен.
Есть ли какие-то асинхронные модальные окна или типа того, что было бы наилучшим решением для меня.
Или же засунуть вызов диалогового окна в отдельный поток, а по получению результата поток освобождать? Если так, достаточно ли будет просто сообщить о результате выполнения потока переменной, или как оно правильно делается?
Асинхронные диалоги\messageloop в отдельном потоке [SOLVED]
Модератор: Модераторы
Асинхронные диалоги\messageloop в отдельном потоке [SOLVED]
Последний раз редактировалось KUKA 27.04.2013 20:38:48, всего редактировалось 1 раз.
KUKA писал(а):Соответственно основная программа перестает отвечать на посланные команды, пока процесс модального окна не завершен.
Про какие команды идет речь?
KUKA писал(а):Или же засунуть вызов диалогового окна в отдельный поток, а по получению результата поток освобождать?
Я не уверен, что LCL многпоточный. В Дельфи VCL точно однопоточный, т.е. Ваше предложение вызовет исключение и м.б. общий крах всей программы.
Умеете же вы четко и ясно формулировать задачи...
Никто никуда ничего не уводит, просто все окна кроме модального становятся disabled, открою небольшую тайну модальных окон лазаря, если после вызова модального окна сделать для родительского окна следующее:
то оно снова станет доступно.
А вам нужно чтоб оно реагировало на мышь и клаву? Тогда не делайте окно модальным, а просто откройте его.
Ответил так, как понял вопрос.
KUKA писал(а):то система как бы "уводит" основной цикл на работу этого диалога
Никто никуда ничего не уводит, просто все окна кроме модального становятся disabled, открою небольшую тайну модальных окон лазаря, если после вызова модального окна сделать для родительского окна следующее:
Код: Выделить всё
ParentForm.Enabled := False;
ParentForm.Enabled := True;KUKA писал(а):что приводит к безответной реакции окна-владельца
А вам нужно чтоб оно реагировало на мышь и клаву? Тогда не делайте окно модальным, а просто откройте его.
Ответил так, как понял вопрос.
При чем тут Lazarus, VLC и прочее. Тема в ветке Free Pascal. У меня обычное окно, создаваемое средствами WinAPI
На нажатие клавиш.
GetSaveFileName\GetOpenFileName это диалоговые окна системы, такие же как и ShowMessage
alexey38 писал(а):Про какие команды идет речь?
На нажатие клавиш.
SeZuka писал(а):Тогда не делайте окно модальным, а просто откройте его.Ответил так, как понял вопрос.
GetSaveFileName\GetOpenFileName это диалоговые окна системы, такие же как и ShowMessage
Так бы и писали сразу что пишите на чистом winapi. В эти функции вы передаете структуру с настройками, так если там hwndOwner установить в 0, разве вы не получите желаемого результата?
KUKA писал(а):У меня обычное окно, создаваемое средствами WinAPI
Не знаю, как Вы конкретно все написали, но в том же самом VCL (который является просто оберткой над WinAPI) вызов модальных окон не нарушает работу таймеров и прочих обработчиков WinMessage. Посмотрите код VCL/LCL, как в нем написано.
KUKA писал(а):На нажатие клавиш.
Насколько я знаю (помню) в неактивные окна, а тем более при открытых модальных, сообщения (WinMessage) о нажатии клавиш не передаются. Для подобных случаев можно использовать хуки (Hook).
