2 votes

Retard de la boîte à messages dans Delphi

J'ai des problèmes avec l'API de la boîte à messages. J'utilise messageboxw pour poser une question à l'utilisateur. Par exemple, mon programme est très occupé par des threads, etc. et lorsqu'un utilisateur clique sur un bouton qui affiche la boîte à messages, celle-ci ne s'affiche pas tant que mon programme n'est pas moins occupé qu'avant. Lorsque je supprime la boîte à messages, le code qui la suit s'exécute correctement. J'ai trop de code à montrer, mais il y a peut-être quelque chose dont je dois m'occuper...

Quelqu'un a-t-il fait la même expérience ?

Merci pour votre aide.

10voto

David Heffernan Points 292687

Ce qui se passe lorsque vous cliquez sur le bouton est qu'un message est posté dans la file d'attente des messages. Il n'est pas traité avant le prochain pompage de la file d'attente des messages. Ainsi, si vous constatez un délai entre le moment où vous cliquez sur le bouton et celui où le programme répond, c'est parce que la file d'attente des messages n'est pas servie en temps voulu.

Si le thread de l'interface graphique est occupé, la file d'attente des messages ne sera pas alimentée tant que le thread principal n'aura pas terminé ce qu'il est en train de faire. Et votre thread d'interface graphique sera occupé si vous avez des tâches de longue haleine. Une fois que le message de clic sur le bouton mis en file d'attente est finalement traité, l'appel à la commande MessageBoxW aura pour effet d'afficher immédiatement la boîte de dialogue.

La seule autre raison pour laquelle le thread GUI ne s'exécuterait pas serait que le CPU soit consommé par des threads plus prioritaires. Mais c'est assez peu probable. Il est très rare que les applications utilisent des threads à haute priorité. Je serais surpris si vous le faisiez.

Comment résoudre le problème ? Si vous avez des tâches qui s'exécutent depuis longtemps sur votre thread principal, déplacez ces tâches sur des threads d'arrière-plan. Ou, si vous avez des threads à haute priorité qui empêchent le thread GUI de fonctionner, exécutez vos threads d'arrière-plan à priorité normale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X