Форум: "Прочее";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];
ВнизСообщение 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.041 c