Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.48 MB
Время: 0.039 c
3-1182192180
Lavrenty
2007-06-18 22:43
2007.10.28
Не работает сообщение (из триггера)


15-1191481433
boriskb
2007-10-04 11:03
2007.10.28
Не новая тема. Напоминалка


2-1191732400
A.Brej
2007-10-07 08:46
2007.10.28
DBLookupComboBox1


15-1191231333
User1999
2007-10-01 13:35
2007.10.28
Process View


1-1186991430
Adventure
2007-08-13 11:50
2007.10.28
Утечка памяти.....





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский