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

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

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

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

Сообщение KUKA » 25.04.2013 17:16:41

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

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

Сообщение alexey38 » 25.04.2013 17:45:59

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

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

Я не уверен, что LCL многпоточный. В Дельфи VCL точно однопоточный, т.е. Ваше предложение вызовет исключение и м.б. общий крах всей программы.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

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

Сообщение SeZuka » 25.04.2013 17:59:41

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

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

Никто никуда ничего не уводит, просто все окна кроме модального становятся disabled, открою небольшую тайну модальных окон лазаря, если после вызова модального окна сделать для родительского окна следующее:
Код: Выделить всё
ParentForm.Enabled := False;
ParentForm.Enabled := True;
то оно снова станет доступно. :roll:
KUKA писал(а):что приводит к безответной реакции окна-владельца

А вам нужно чтоб оно реагировало на мышь и клаву? Тогда не делайте окно модальным, а просто откройте его.
Ответил так, как понял вопрос.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

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

Сообщение KUKA » 25.04.2013 18:02:25

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

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

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

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

GetSaveFileName\GetOpenFileName это диалоговые окна системы, такие же как и ShowMessage
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

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

Сообщение SeZuka » 25.04.2013 18:57:19

Так бы и писали сразу что пишите на чистом winapi. В эти функции вы передаете структуру с настройками, так если там hwndOwner установить в 0, разве вы не получите желаемого результата?
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

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

Сообщение alexey38 » 25.04.2013 19:00:13

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

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

Насколько я знаю (помню) в неактивные окна, а тем более при открытых модальных, сообщения (WinMessage) о нажатии клавиш не передаются. Для подобных случаев можно использовать хуки (Hook).
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru