Асинхронные диалоги\messageloop в отдельном потоке [SOLVED]

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Ответить
KUKA
новенький
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Асинхронные диалоги\messageloop в отдельном потоке [SOLVED]

Сообщение KUKA »

Задача какая. Я думаю все знают, что если вызвать какое-то виндовое модальное окно или диалог, то система как бы "уводит" основной цикл на работу этого диалога, что приводит к безответной реакции окна-владельца.
В общем при сохранении файла я использую GeSavetFileName. Соответственно основная программа перестает отвечать на посланные команды, пока процесс модального окна не завершен.
Есть ли какие-то асинхронные модальные окна или типа того, что было бы наилучшим решением для меня.
Или же засунуть вызов диалогового окна в отдельный поток, а по получению результата поток освобождать? Если так, достаточно ли будет просто сообщить о результате выполнения потока переменной, или как оно правильно делается?
Последний раз редактировалось KUKA 27.04.2013 20:38:48, всего редактировалось 1 раз.
alexey38
долгожитель
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Сообщение alexey38 »

KUKA писал(а):Соответственно основная программа перестает отвечать на посланные команды, пока процесс модального окна не завершен.

Про какие команды идет речь?
KUKA писал(а):Или же засунуть вызов диалогового окна в отдельный поток, а по получению результата поток освобождать?

Я не уверен, что LCL многпоточный. В Дельфи VCL точно однопоточный, т.е. Ваше предложение вызовет исключение и м.б. общий крах всей программы.
SeZuka
постоялец
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Сообщение SeZuka »

Умеете же вы четко и ясно формулировать задачи...

KUKA писал(а):то система как бы "уводит" основной цикл на работу этого диалога

Никто никуда ничего не уводит, просто все окна кроме модального становятся disabled, открою небольшую тайну модальных окон лазаря, если после вызова модального окна сделать для родительского окна следующее:

Код: Выделить всё

ParentForm.Enabled := False;
ParentForm.Enabled := True;
то оно снова станет доступно. :roll:
KUKA писал(а):что приводит к безответной реакции окна-владельца

А вам нужно чтоб оно реагировало на мышь и клаву? Тогда не делайте окно модальным, а просто откройте его.
Ответил так, как понял вопрос.
KUKA
новенький
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Сообщение KUKA »

При чем тут Lazarus, VLC и прочее. Тема в ветке Free Pascal. У меня обычное окно, создаваемое средствами WinAPI

alexey38 писал(а):Про какие команды идет речь?

На нажатие клавиш.

SeZuka писал(а):Тогда не делайте окно модальным, а просто откройте его.Ответил так, как понял вопрос.

GetSaveFileName\GetOpenFileName это диалоговые окна системы, такие же как и ShowMessage
SeZuka
постоялец
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Сообщение SeZuka »

Так бы и писали сразу что пишите на чистом winapi. В эти функции вы передаете структуру с настройками, так если там hwndOwner установить в 0, разве вы не получите желаемого результата?
alexey38
долгожитель
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Сообщение alexey38 »

KUKA писал(а):У меня обычное окно, создаваемое средствами WinAPI

Не знаю, как Вы конкретно все написали, но в том же самом VCL (который является просто оберткой над WinAPI) вызов модальных окон не нарушает работу таймеров и прочих обработчиков WinMessage. Посмотрите код VCL/LCL, как в нем написано.
KUKA писал(а):На нажатие клавиш.

Насколько я знаю (помню) в неактивные окна, а тем более при открытых модальных, сообщения (WinMessage) о нажатии клавиш не передаются. Для подобных случаев можно использовать хуки (Hook).
Ответить