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

Вниз

Сообщение Windows с кодом $B03F   Найти похожие ветки 

 
Darvin ©   (2007-07-16 16:16) [0]

Здравствуйте!
Где можно почитать про сообщение с таким кодом? У меня одно из окон принимает эти сообщения в покое и при этом грузит процессор.
Это сообщение лежит в диапазоне сообщений VCL, а что это конкретно за сообщение?


 
Virgo_Style ©   (2007-07-16 16:25) [1]

Подходящей WM_ - константы не нашел?


 
Darvin ©   (2007-07-16 16:27) [2]

не-а. Поиск по Messages.pas ничего не дает :-(


 
Darvin ©   (2007-07-16 16:27) [3]

не-а. Поиск по Messages.pas ничего не дает :-(


 
Darvin ©   (2007-07-16 16:31) [4]

Нашел, это CM_ACTIONUPDATE в Controls.pas


 
umbra ©   (2007-07-16 16:32) [5]

CM_ACTIONUPDATE (CM_BASE + $3F, Controls.pas)


 
Darvin ©   (2007-07-16 16:34) [6]

Странно однако, у этой формы ни одного обработчика OnActionUpdate нет.


 
Darvin ©   (2007-07-16 17:02) [7]

Правда, есть несколько компонентов TActionList, лежащих на фрейме, несколько экземпляров которых (фреймов) динамически помещаются на форму при ее создании. Но на их Action-ах также не обрабатываются OnUpdate.

Если я переопределю оконную процедуру WindowProc, и не буду для этих событий ($B03F) вызывать WndProc(Message), а для остальных буду, то загрузка процессора резко падает. В чем может быть дело?

   WindowProc := SubClassWndProc;
...

procedure TfmExecMultMonSt.SubClassWndProc(var Message: TMessage);
begin
 if  ( Message.Msg <> $B03F ) then
 begin
   WndProc(Message);
 end;
end;


 
umbra ©   (2007-07-16 17:33) [8]


> В чем может быть дело?

проверяются все контролы, имеющиеся на форме (учитывая другие контейнеры, т.е. панелиб фреймы и т.д.), и если у него назначено св-во Action, выполняет обработчик.


 
Darvin ©   (2007-07-16 17:43) [9]

umbra ©   (16.07.07 17:33) [8]
нигде не назначено свойство Action


 
umbra ©   (2007-07-16 17:54) [10]

это не важно, суть в том, что все равно рекурсивно проходятся все контролы, и если их много - тормоза.


 
oxffff ©   (2007-07-16 18:57) [11]

procedure TApplication.DoActionIdle;


 
Darvin ©   (2007-07-17 09:47) [12]

>umbra ©   (16.07.07 17:54) [10]
Понял. Но фишка в том, что у меня сообщения CM_ACTIONUPDATE приходят слишком часто 3 - 4 тысячи в секунду. Откуда может быть такое количество?

>oxffff ©   (16.07.07 18:57) [11]
А что это за зверь TApplication.DoActionIdle? Я его не нашел ни в справке, ни в исходниках.


 
oxffff ©   (2007-07-17 11:31) [13]


> >oxffff ©   (16.07.07 18:57) [11]
> А что это за зверь TApplication.DoActionIdle? Я его не нашел
> ни в справке, ни в исходниках.


Нужно заглянуть

procedure TApplication.HandleMessage;
var
 Msg: TMsg;
begin
 if not ProcessMessage(Msg) then Idle(Msg);
end;

Далее  в idle идет вызов DoActionIdle;

Посылка сообщения CM_ACTIONUPDATE идет только в unit ActnList

function TContainedAction.Update: Boolean;
begin
 Result := (ActionList <> nil) and ActionList.UpdateAction(Self) or
   Application.UpdateAction(Self) or inherited Update or
   (SendAppMessage(CM_ACTIONUPDATE, 0, Longint(Self)) = 1);
end;

А поскольку TContainedAction является потомком TBasicAction, он и шлет это сообщение при idle.

Я думаю что покать надо в это направлении. :)


 
oxffff ©   (2007-07-17 11:32) [14]

покать=копать. ;)


 
oxffff ©   (2007-07-17 11:43) [15]

Скорее всего получается зацикливание поскольку SendAppMessage инициирует посылку сообщения CM_ACTIONUPDATE в TContainedAction.Update. Что приводит к очередному вызову Idle(Msg), и т.д.


 
Darvin ©   (2007-07-17 11:45) [16]

>oxffff ©   (17.07.07 11:31) [13]
Спасибо!
Я разобрался с проблемой. У меня возникала ситуация, когда на форме оказывалось несколько TActionList. Когда я оставил один, загрузка ушла.


 
oxffff ©   (2007-07-17 12:13) [17]


> Darvin ©   (17.07.07 11:45) [16]
> >oxffff ©   (17.07.07 11:31) [13]
> Спасибо!
> Я разобрался с проблемой. У меня возникала ситуация, когда
> на форме оказывалось несколько TActionList. Когда я оставил
> один, загрузка ушла.


Все же попробуй объяснить(реконструировать) как ты добился такого поведния нормальными средствами.


 
Darvin ©   (2007-07-17 13:44) [18]

>oxffff ©   (17.07.07 12:13) [17]
Что значит "нормальными средствами"? С одним TActionList?


 
oxffff ©   (2007-07-17 14:23) [19]


> Darvin ©   (17.07.07 13:44) [18]
> >oxffff ©   (17.07.07 12:13) [17]
> Что значит "нормальными средствами"? С одним TActionList?
>


в описании TActionList не указано, что он должен быть один.

Поэтому приведи последовательность шагов, чтобы данную ситуацию воспроизвести в пустом проекте.
Т.е. меня интересует, является ли данная ситуация ошибкой VCL или нет?
Если да, то я направлю bug report в codegear.


 
Darvin ©   (2007-07-17 16:09) [20]

>oxffff ©   (17.07.07 14:23) [19]
Попробую.



Страницы: 1 вся ветка

Текущий архив: 2007.08.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
15-1184503367
Kerl
2007-07-15 16:42
2007.08.12
Книги D7


15-1184110473
Bad_B
2007-07-11 03:34
2007.08.12
Нетрадиционное чтение))))


2-1184346134
WFS
2007-07-13 21:02
2007.08.12
Как поменять название поля в базе данных (программным образом)?


8-1163045712
Lilu
2006-11-09 07:15
2007.08.12
DirectDraw и вывод текста под углом


2-1184743005
Grademax
2007-07-18 11:16
2007.08.12
Как узнать окно какой программы активно в данный момент?