Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are : visible, control assigned TActions affecting the CPU usage of the application?

If a TAction is linked to an Object such as TToolButton( Item of TToolBar ) or TActionClientItem( Item of TActionToolBar ) and that Object is visible on runtime, then whenever you move the mouse in the form (anywhere but the Toolbars), there seems to be extra load being done on the CPU based on the number of visible TActions, that is in comparison to moving the mouse when none of the TAction linked Items are visible on either of the previous mentioned bars.

It's obvious that the noticeable % of extra load done is completely based on what kind of a rig you are running but what I have noticed is that the actual difference can be significant when you have an application with :

  • a lot of visible TAction linked items
  • a custom component that already performs minor calculations for onMouseOver Events such as changing the appearance of the control
  • a custom Visual Style

So the question is why do visible item linked TAction components affect the processing of mouse movement?

like image 340
Peter Avatar asked Feb 18 '23 17:02

Peter


2 Answers

The design of actions is based on idle time updating of actions. As you move your mouse, the application receives lots of queued messages. Each time the queue is emptied, the application is deemed to be idle, and all the actions are updated. And this can lead to high CPU utilization.

This issue is well known and acknowledged in the VCL. For example, take a look at TApplication.ActionUpdateDelay.

like image 89
David Heffernan Avatar answered Apr 29 '23 17:04

David Heffernan


From memory: because each mouse movement triggers OnUpdate events. At the very least each mouse movement triggers enumeration of all actions to see whether their OnUpdate events are assigned so that they can be triggered. When the linked controls are not visible, these events are not triggered.

like image 32
Marjan Venema Avatar answered Apr 29 '23 19:04

Marjan Venema