![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Понизить приоритет сообщения в очереди окна [XP]
Ping © (2007-10-02 09:14:00)Как бы так сделать, чтобы пользовательское сообщение (например, WM_DOIT = WM_USER + $100), помещаемое в очередь сообщений окна при помощи PostMessage(), имело бы то же или более низкий приоритет, чем, например, WM_PAINT.
То есть, если окну надо перерисоваться, то чтобы оно перерисовывалось, а уж потом обрабатывало пользовательское сообщение.
Интересно именно "понижение приоритета" сообщения в очереди любого окна, желательно, стандартными средствами. То есть, не хотелось бы трогать обработчики сообщений. Ну да если уж никак нельзя, то...
Ping (2007-10-02 12:21:00) [1]Сорри, опечатка. Конечно очередь.
Просто уже другой задачей занимаюсь, мысли все о стеке...
Сергей М. (2007-10-02 12:17:00) [2]
> Сделал уже стекпараметров
Хм ..Как очередьсочетается со стеком?
Ping (2007-10-02 12:14:00) [3]А незачем без явной нужды замусоривать очередь одинаковыми сообщениями
Там параметры передаются. Так что они не одинаковые.
Ну да ладно. Сделал уже стек параметров. Помещаю параметры в стек. Ну и пока стек не исчерпан, изымаю и обрабатываю их (параметры).
2 Сергей М. ©
Спасибо за содействие... :-)
Сергей М. (2007-10-02 11:26:00) [4]
> Ping (02.10.07 11:16) [7]
> при помещении в очередь большого количества WM_MYMESSAGE,
> они "забивают очередь"
А незачем без явной нуждызамусоривать очередь одинаковыми сообщениями)
В большинстве случаев можно обойтись одним-единственным)
> [6] повышает приоритет WM_PAINT
[6] НЕповышает никаких приоритетов.
В момент "предварительной" обработки WM_MYMESSAGE это сообщение уже выбрано из очереди, и если в очереди не имеется ни одного WM_PAINT, то выполняется "основная" обработка (см. ProcessMessage), в противном случае выбранное сообщение тут же помещается в хвост очереди.
Ping (2007-10-02 11:16:00) [5]Сергей М. © (02.10.07 10:38) [6]
Так тоже не катит.
Дело в том, что, при помещении в очередь большого количества WM_MYMESSAGE, они "забивают очередь", и приходящие после тогопрочие сообщения "дожидаются своей очереди".
То есть, [6] повышаетприоритет WM_PAINT, и то лишь при наличии в очереди WM_MYMESSAGE.
А мне надо понизитьприоритет WM_MYMESSAGE.
То есть, как-то вот так:
var
Msg: tagMSG;
begin
case a_Msg.Msg of
WM_MYMESSAGE:
if PeekMessage(Msg, 0, 0, WM_MYMESSAGE - 1, PM_REMOVE) or
PeekMessage(Msg, 0, WM_MYMESSAGE + 1, High(cardinal), PM_REMOVE) then
DispatchMessage()
else
begin
// обработка
end;
else
DispatchMessage()
end;
Но некоторые сообщения все равно не доходят. Причины, увы, я не знаю. Может, кто подскажет?
Плохиш © (02.10.07 10:27) [4]
Не знаю, как в мелкософте, но ты - точно.
Сергей М. (2007-10-02 10:38:00) [6]
procedure TForm1.handlerWinMsgMessage(a_Sender: TObject; a_Msg: TMessage);
var
Msg: tagMSG;
begin
case a_Msg.Msg of
WM_MYMESSAGE:
if PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_NOREMOVE) then
PostMessage(Msg.Handle, Msg.Message, Msg.wParam, Msg.lParam)
else
ProcessMessage(a_Msg);
else
DispatchMessage(a_Msg);
end;
end;
Riply (2007-10-02 10:28:00) [7]> [0] Ping (02.10.07 09:14)
> То есть, если окну надо перерисоваться, то чтобы оно перерисовывалось,
> а уж потом обрабатывало пользовательское сообщение.
WaitForInputIdle перед PostMessage ?
Плохиш (2007-10-02 10:27:00) [8]Ну да, в мелкомсофте дураки сидят, какие-то неправильные приоритеты сообщениям пораздавали, вот Ping сейчас наведёт там порядок...
Ping (2007-10-02 10:21:00) [9]Написал вот такой вот... кхм... код :
const
WM_MYMESSAGE = WM_USER + $100;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to 100 do
begin
Invalidate;
PostMessage(handlerWinMsg.Handle, WM_MYMESSAGE, 0, 0);
end;
end;
procedure TForm1.handlerWinMsgMessage(a_Sender: TObject; a_Msg: TMessage);
var
Msg: tagMSG;
begin
case a_Msg.Msg of
WM_MYMESSAGE:
begin
while PeekMessage(Msg, 0, 0, WM_PAINT - 1, PM_REMOVE) or
PeekMessage(Msg, 0, WM_PAINT + 1, WM_MYMESSAGE - 1, PM_REMOVE) or
PeekMessage(Msg, 0, WM_MYMESSAGE + 1,High(cardinal), PM_REMOVE) do
DispatchMessage(Msg);
if PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE) then
DispatchMessage(Msg);
Sleep(100);
end;
end;
end;
Рисоваться-то оно рисуется. Но вот системные оконные сообщение, наподобие "переместить окно", "закрыть окно" - как-то уж совсем не работают... Зато "свернуть"/"развернуть" - работает. Хотя, может, это Windows XP -> Ghost Windows создает?
Фигня, короче...
Сергей М. (2007-10-02 10:15:00) [10]Никак.
Придется доработать напильником обработчик WM_DOIT.
Инс (2007-10-02 10:10:00) [11]Скорее всего это невозможно, по крайней мере мне способ неизвестен. Алгоритм выборки сообщений из очереди хорошо описан, ничего подобного там не видел.
> имело бы то же или более низкий приоритет, чем, например,
> WM_PAINT.
Посылайте WM_TIMER. И обрабатывайте как вам угодно. Только будет масса побочных эффектов, в частности, могут теряться настоящие сообщения WM_TIMER.