Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
ВнизПонизить приоритет сообщения в очереди окна Найти похожие ветки
← →
Ping (2007-10-02 09:14) [0]Как бы так сделать, чтобы пользовательское сообщение (например, WM_DOIT = WM_USER + $100), помещаемое в очередь сообщений окна при помощи PostMessage(), имело бы то же или более низкий приоритет, чем, например, WM_PAINT.
То есть, если окну надо перерисоваться, то чтобы оно перерисовывалось, а уж потом обрабатывало пользовательское сообщение.
Интересно именно "понижение приоритета" сообщения в очереди любого окна, желательно, стандартными средствами. То есть, не хотелось бы трогать обработчики сообщений. Ну да если уж никак нельзя, то...
← →
Инс © (2007-10-02 10:10) [1]Скорее всего это невозможно, по крайней мере мне способ неизвестен. Алгоритм выборки сообщений из очереди хорошо описан, ничего подобного там не видел.
> имело бы то же или более низкий приоритет, чем, например,
> WM_PAINT.
Посылайте WM_TIMER. И обрабатывайте как вам угодно. Только будет масса побочных эффектов, в частности, могут теряться настоящие сообщения WM_TIMER.
← →
Сергей М. © (2007-10-02 10:15) [2]Никак.
Придется доработать напильником обработчик WM_DOIT.
← →
Ping (2007-10-02 10:21) [3]Написал вот такой вот... кхм... код :
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:27) [4]Ну да, в мелкомсофте дураки сидят, какие-то неправильные приоритеты сообщениям пораздавали, вот Ping сейчас наведёт там порядок...
← →
Riply © (2007-10-02 10:28) [5]> [0] Ping (02.10.07 09:14)
> То есть, если окну надо перерисоваться, то чтобы оно перерисовывалось,
> а уж потом обрабатывало пользовательское сообщение.
WaitForInputIdle перед PostMessage ?
← →
Сергей М. © (2007-10-02 10:38) [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;
← →
Ping (2007-10-02 11:16) [7]Сергей М. © (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 11:26) [8]
> Ping (02.10.07 11:16) [7]
> при помещении в очередь большого количества WM_MYMESSAGE,
> они "забивают очередь"
А незачем без явной нужды замусоривать очередь одинаковыми сообщениями)
В большинстве случаев можно обойтись одним-единственным)
> [6] повышает приоритет WM_PAINT
[6] НЕ повышает никаких приоритетов.
В момент "предварительной" обработки WM_MYMESSAGE это сообщение уже выбрано из очереди, и если в очереди не имеется ни одного WM_PAINT, то выполняется "основная" обработка (см. ProcessMessage), в противном случае выбранное сообщение тут же помещается в хвост очереди.
← →
Ping (2007-10-02 12:14) [9]А незачем без явной нужды замусоривать очередь одинаковыми сообщениями
Там параметры передаются. Так что они не одинаковые.
Ну да ладно. Сделал уже стек параметров. Помещаю параметры в стек. Ну и пока стек не исчерпан, изымаю и обрабатываю их (параметры).
2 Сергей М. ©
Спасибо за содействие... :-)
← →
Сергей М. © (2007-10-02 12:17) [10]
> Сделал уже стек параметров
Хм ..Как очередь сочетается со стеком ?
← →
Ping (2007-10-02 12:21) [11]Сорри, опечатка. Конечно очередь.
Просто уже другой задачей занимаюсь, мысли все о стеке...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.06 c