Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1184009465
Petr V. Abramov
2007-07-09 23:31
2007.08.12
задача по физике :)


15-1184328896
Суслик
2007-07-13 16:14
2007.08.12
Delphi2007 + Code folding


2-1184308818
Kolan
2007-07-13 10:40
2007.08.12
Почему один пакет не видит, что в другом пакете есть класс?


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


3-1177679032
DelphiLexx
2007-04-27 17:03
2007.08.12
Как сделать, чтобы транзакция делала автоматичекси rollback





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