Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];

Вниз

Обработка сообщений   Найти похожие ветки 

 
uu   (2003-03-03 17:57) [0]

Обычно сообщения, посылаемые приложению, обрабатываются оконной функцией, которая возвращает какие-то значения в систему. У меня в программе нет никаких окон, нет, соответственно, и оконной функции. А есть вот такое:

...
repeat
GetMessage(Msg, 0, 0, 0);
case Msg.Message of
...
end;
until False;
...

То есть я не возвращаю Винде ничего в ответ на сообщения, и она считает, что моя программа зависла. Что делать, чтобы развеять это ее заблуждение?


 
MBo   (2003-03-03 18:01) [1]

Msg.Result присваивать?


 
uu   (2003-03-03 18:03) [2]

type

TMsg = packed record
hwnd: HWND;
message: UINT;
wParam: WPARAM;
lParam: LPARAM;
time: DWORD;
pt: TPoint;

end;

нет здесь msg.result!


 
GiGi   (2003-03-03 21:53) [3]

А, собственно, у винды есть время эти самые сообщения обработать??? а то цикл-то - он и есть цикл... Точнеее, у проги твоей (или все-таки у винды точнее ??? :-)


 
Suntechnic   (2003-03-03 22:31) [4]

Вообщем то заблуждение у тебя, а не у Windows :)

Если у тебя нет окна, то это совсем не означает, что не надо вызывать TranslateMessage и DispatchMessage. Ну и неплохо бы добавить условие выхода из цикла отличное от until False! Цикл должен заканчиваться когда GetMessage вернёт 0. А 0 будет возвращён в ответ на сообщение WM_QUIT, котрое при отсутствии окна можно поставить в очередь сообщений потока.


 
Suntechnic   (2003-03-03 22:34) [5]

>GiGi ©
А, собственно, у винды есть время эти самые сообщения обработать??? а то цикл-то - он и есть цикл...


Времени Windows навалом... GetMessage как раз и служит для того, чтобы приостановить цикл пока очередь сообщений пуста. Так что в этом плане всё чисто и красиво.


 
uu   (2003-03-05 18:36) [6]

>Suntechnic
Если у меня нет окна, то у меня нет оконной функции, а DispatchMessage делает ничто иное, как передает сообщение этой самой функции, насколько я знаю.
А вот насчет WM_Quit... Это надо попробовать. Я почему-то реагировал только на WM_Close.


 
Suntechnic   (2003-03-05 19:20) [7]

>uu © (05.03.03 18:36)
Если у меня нет окна, то у меня нет оконной функции, а DispatchMessage делает ничто иное, как передает сообщение этой самой функции...

Откуда такая уверенность? MSDN по этому поводу молчит. Описание деталей реализации этой ф-ции я у Microsoft не встречал...

Да чего там далеко ходить. Парни из Борланд в этом тоже не уверены учитывая имплементацию TApplication.ProcessMessage. Обрати внимание на второй параметр ф-ции PeekMessage. Следуя твоей логике TranslateMessage, DispatchMessage это две лишние строчки.


function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end
else
FTerminate := True;
end;
end;


 
DVM   (2003-03-05 21:28) [8]

Создай окно с нулевыми размерами и все проблемы решатся. Это стандартный подход.


 
uu   (2003-03-06 14:10) [9]

Цитата из прилагающегося к Делфи 6 MS SDK:
"The DispatchMessage function dispatches a message to a window procedure."
Цитата с lingvo.ru (статья dispatch):
"посылать; отсылать, отправлять по назначению (to)"


 
Suntechnic   (2003-03-06 16:27) [10]

>uu ©
Чем DispatchMessage занимается разъяснять конечно не надо. И перевод тоже приводить незачем. Я вёл речь о том, что неизвестно что она делает помимо того, что диспатчит сообщения оконной ф-ции...


Меня вот другой вопрос заинтересовал... каким образом ты определил что Windows решила что твоя программа зависла?


 
Digitman   (2003-03-06 16:49) [11]


> uu


как минимум вызов DispatchMessage() должен быть !
код.поток (отличный от код.потока, принимающего/обрабатывающего сообщения) "зависает" на ожидании именно DispatchMessage()

в этом легко убедиться, вызвав , к примеру, вместо SendMessage() ф-цию SendMessageTimeout(). Результат последней в случае обнаружения таймаута явно укажет на причину


 
Набережных С.   (2003-03-06 22:27) [12]

DispatchMessage здесь, конечно, не нужен. И SendMessage не применишь, т.к. окон нет:) Система считает поток зависшим, если он не обращается к своей очереди сообщений более 5-ти секунд, если правильно помню цифру.
Как уже сказал Suntechnic © (03.03.03 22:31), цикл должен выглядеть примерно так
while GetMessage(...) do
case Msg.Message of
....
end;
И если нигде в case ты программу не завешиваешь, то все будет нормально.


 
Suntechnic   (2003-03-07 00:02) [13]

Давайте сойдёмся на том, что DispatchMessage здесь не навредит :) Это стандартная практика вызывать DispatchMessage даже если нет ни одного окна. Потому как пути Господни неисповедимы и завтра это окно может появится и не дождаться своих сообщений. Ну а негативных последствий от вызова DispatchMessage без окон никто никогда не наблюдал...

А проблемы отвисаний, как верно заметил Набережных С., надо искать внутри цикла.




 
uu   (2003-03-07 13:34) [14]

>
> Suntechnic

Ну я снимаю прогу по Ctrl-Alt-Del, и мне говорят, что программа занята или ожидает ответа пользователя - что-то в этом роде. Причем сразу же, - без паузы, как часто бывает.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
1-12755
vvvaaa
2003-04-21 14:42
2003.05.05
Изменение размера в Runtime


14-12921
DenKop
2003-04-18 00:24
2003.05.05
Что такое моразм (не знаю как правильно)?


1-12778
NewN
2003-04-22 08:19
2003.05.05
Окно поверх других окон.


1-12819
sapsi
2003-04-21 15:37
2003.05.05
Кодировка КОи-8


1-12696
salvo
2003-04-22 18:25
2003.05.05
StrToFloat





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский