Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

Понизить приоритет сообщения в очереди окна   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.071 c
2-1191512951
ist
2007-10-04 19:49
2007.10.28
язык в версии файла....


2-1191840185
Term
2007-10-08 14:43
2007.10.28
Как узнать в событии OnClick имя компонента по которому кликнул


15-1190735781
ferdinando
2007-09-25 19:56
2007.10.28
Есть один человек...


15-1190521963
Nastena
2007-09-23 08:32
2007.10.28
Как установить Виндуоз ХР с форматирование диска


2-1191178266
kalexi
2007-09-30 22:51
2007.10.28
CreateFile - считывание дискеты в файл и обратная запись на нее