Ça ne sert à rien d'aller plus loin sans expliquer un minimum le concept.
Windows implémente une pile de messages globale.
Chaque
thread qui requiert une gestion des messages va créer un pile qui lui est propre. Tout processus possède au minimum un
thread et toute application graphique nécessite une gestion des messages.
Windows va transférer les messages de la pile globale dans les "sous-piles" en fonction de la cible.
L'application va vider cette pile dans une boucle infinie et transférer ces messages (
dispatch) aux différentes fiches qui les feront éventuellement suivre au composants, etc.
La création de la pile du
thread n'est pas automatique, c'est à l'application de la créer. Il n'y a pas de fonction particulière pour cela, elle est créée automatiquement au premier accès par
GetMessage ou
PeekMessage.
Dans Delphi, c'est
TApplication.Run qui intègre la boucle de récupération des messages et c'est à ce moment-là que la pile du
thread principal est effectivement créée. Avant cela, l'
application n'a pas de gestionnaire de messages.
Mais une fenêtre n'a pas besoin de message pour se dessiner,
WM_PAINT lui indique simplement que le rendu doit être rafraîchi suite à un autre événement : l'ordre d’empilement (Z-order) à changé, sa taille à changé, etc.
Vient maintenant
TApplication.ProcessMessages. Cette méthode implémente également une boucle qui va lire les messages à l'instar de
Run (mais sans gestionnaire d'exceptions) et son but premier est que lorsque la boucle
Run est bloquée sur le traitement d'un événement (ex. un clique sur un bouton lançant un traitement long) d'autres messages puissent toujours être traités (ex. un clique sur un bouton d'annulation, une repeinture, etc.).
TApplication.Run et
TApplication.ProcessMessages utilise la même méthode de récupération des messages :
TApplication.ProcessMessage (au singulier). Dans les deux cas
PeekMessage est invoqué et la pile est créée si elle n'existe pas encore.
TApplication.ProcessMessages crée donc prématurément cette pile et tous les messages peuvent maintenant être récupérés. Mais cela implique aussi que
TApplication.ProcessMessages soit appelé régulièrement (minimum toutes les 5 secondes) pour éviter un "
L'application ne répond pas".
En résumé, si la
SplashForm ne fait qu'afficher du texte un
TForm.Update régulier suffit et Windows ne dira rien si le traitement est long (c'est la pile du
thread qui est contrôlée), mais s'il faut de l'interaction
TApplication.ProcessMessages est nécessaire et devra également être invoqué régulièrement sous peine de voir l'OS râler.
Il n'y a aucune contre-indication à l'un ou à l'autre, c'est fonction du besoin
Partager