Pourquoi un TidTCPClient dans un thread séparé bloque-t-il le thread principal?
-
28-10-2019 - |
Question
Un thread séparé crée un TidTCPClient et un TTimer.Le TTimer est défini sur 3s et si le TCPClient n'est pas connecté, il appelle TCPClient.Connect.
S'il n'y a pas de serveur auquel se connecter, cela entraîne une tentative de connexion toutes les 3 secondes.
Le thread principal (UI) ne fait rien, mais si j'attrape la fenêtre avec la souris et la déplace lentement sur l'écran, elle reste bloquée toutes les 3 secondes pendant environ 2 secondes, puis elle passe à la position du curseur de la souris etsuit à nouveau la souris jusqu'à ce que la prochaine tentative de connexion se produise.
En d'autres termes, le thread principal semble être bloqué lorsque le TCPClient tente de se connecter.
Pourquoi cela se produit-il, même si le TCPClient est dans son thread séparé?
La solution
Votre TTimer fonctionne en recevant des messages WM_TIMER;Ces messages sont distribués à l'aide de la pompe de messages principale de la VCL, dans les threads de la VCL.Après l'expiration des 3 secondes, votre événement TTimer.OnTimer s'exécute dans le thread principal , donc l'appel à Connect
s'exécute dans le thread principal de la VCL.
Vous êtes bloqué parce que vous ne filmez pas!