Форум: "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