Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2007, 18:27   #1
P@SH@
 
Регистрация: 03.09.2007
Сообщений: 7
По умолчанию MsgWaitForMultipleObjects

Есть следующий код:

PHP код:
while not fQuit do begin
dwResult 
:= MsgWaitForMultipleObjectsEx(0,nil,INFINITE,QS_ALLINPUT,0);
case 
dwResult of
WAIT_OBJECT_0
:
while 
PeekMessage(aMsg000PM_REMOVE) do 
if 
aMsg.message WM_QUIT then
fQuit 
:= True
else begin
TranslateMessage
(aMsg);
DispatchMessage(aMsg);
end;
end// case
end// while not fQuit 
Если код выполняется в главной форме, то всё в порядке.
А если форма создаётся из потока:
PHP код:
Form2 := TForm2.Create(nil);
Form2.ShowModal;
Form2.Free
то где-то перехватывается сообщение WM_QUIT (я предполагаю, что его перехватывает Application) и форма не закрывается.

Может кто объяснит, что здесь происходит? и как с этим бороться?
P@SH@ вне форума Ответить с цитированием
Старый 03.09.2007, 20:12   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

чего-то я не понял?
если приложение с формами, то зачем вообще приведённый код. У объекта Application есть свой собственный цикл обработки сообщений.
по конкретнее пожалуйста
rpy3uH вне форума Ответить с цитированием
Старый 03.09.2007, 22:11   #3
P@SH@
 
Регистрация: 03.09.2007
Сообщений: 7
По умолчанию

Существует циклограмма опроса некоторого прибора, которая может изменяться от случая к случаю. В соответствии с ней должна выполняться последовательность действий, например, таких, как запуск потоков для опроса прибора, их завершение и т. п. Для выдерживания временных интервалов используется WaitableTimer, а чтобы форма могла реагировать на сообщения пользователя, и была выбрана MsgWaitForMultipleObjects.
P@SH@ вне форума Ответить с цитированием
Старый 04.09.2007, 20:23   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от P@SH@ Посмотреть сообщение
(я предполагаю, что его перехватывает Application) и форма не закрывается.
возможно так и есть

Цитата:
Сообщение от P@SH@ Посмотреть сообщение
Может кто объяснит, что здесь происходит? и как с этим бороться?
мистика какая-то....можно обрабатывать сообщение WM_CLOSE
rpy3uH вне форума Ответить с цитированием
Старый 04.09.2007, 21:50   #5
P@SH@
 
Регистрация: 03.09.2007
Сообщений: 7
По умолчанию

WM_QUIT, WM_DESTROY, WM_CLOSE - всё едино. Вообще-то что хотел, сделал с помощью пользовательского таймера. Просто интересно что к чему.
P@SH@ вне форума Ответить с цитированием
Старый 05.09.2007, 20:05   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

WM_QUIT, WM_DESTROY, WM_CLOSE - разные вещи
rpy3uH вне форума Ответить с цитированием
Старый 06.09.2007, 00:17   #7
P@SH@
 
Регистрация: 03.09.2007
Сообщений: 7
По умолчанию

Я хотел сказать, что ни одно из этих сообщений в очереди сообщений не появляется, пока не окончен цикл обработки MsgWaitForMultipleObjectsEx.
P@SH@ вне форума Ответить с цитированием
Старый 06.09.2007, 01:12   #8
Tokolist
Пользователь
 
Аватар для Tokolist
 
Регистрация: 04.09.2007
Сообщений: 19
По умолчанию

Цитата:
Сообщение от P@SH@ Посмотреть сообщение
Существует циклограмма опроса некоторого прибора, которая может изменяться от случая к случаю. В соответствии с ней должна выполняться последовательность действий, например, таких, как запуск потоков для опроса прибора, их завершение и т. п. Для выдерживания временных интервалов используется WaitableTimer, а чтобы форма могла реагировать на сообщения пользователя, и была выбрана MsgWaitForMultipleObjects.
Может я чегото недопонимаю , но почему бы вам не воспользоваться TThread (CreateThread)
Tokolist вне форума Ответить с цитированием
Старый 10.09.2007, 20:03   #9
P@SH@
 
Регистрация: 03.09.2007
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Tokolist Посмотреть сообщение
Может я чегото недопонимаю , но почему бы вам не воспользоваться TThread (CreateThread)
Дело в том, что последовательность операций с прибором может изменяться в зависимости от конкретных условий. Отдельная операция (например, опрос информации прибора) как раз и выполняется в отдельном потоке. Для синхронизации работы таких потоков с циклограммой хотел использовать MsgWaitForMultipleObjectsEx. Если данный код выполняется в главной форме приложения, то проблем никаких нет. Но если форма не является главной, то не удаётся её закрыть до тех пор пока не сработает ожидаемое событие либо таймаут.
P@SH@ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц