2011-03-22 4 views
0

Un thread distinct crée un TidTCPClient et un TTimer. TTimer est défini sur 3s et si TCPClient n'est pas connecté, il appelle TCPClient.Connect.
S'il n'y a pas de serveur auquel se connecter, cela provoque une tentative de connexion toutes les 3 secondes. Le thread principal (UI) ne fait rien, mais si je prends la fenêtre avec la souris et la déplace lentement à travers l'écran, il est coincé toutes les 3 secondes pendant environ 2 secondes, puis il passe à la position du curseur de la souris et suit à 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 un TidTCPClient dans un thread séparé bloque-t-il le thread principal?

Pourquoi cela se produit-il, même si le TCPClient est dans son thread séparé?

+1

Les composants n'existent pas dans les threads, ils existent en mémoire. Le code s'exécute dans le thread dans lequel vous l'appelez. –

Répondre

6

Votre TTimer fonctionne en recevant des messages WM_TIMER; Ces messages sont envoyés à l'aide de la pompe de messages principale de la VCL, dans les threads VCL. Après l'expiration des 3 secondes, votre événement TTimer.OnTimer s'exécute dans le thread principal, de sorte que l'appel à Connect s'exécute dans le thread VCL principal.

Vous êtes bloqué parce que vous ne filez pas!

+1

+1 pour "parce que vous ne filez pas!" – jachguate

+1

Ceci n'est vrai que si le TTimer est créé dans le contexte du thread principal, comme dans le constructeur du thread. avoir un TTimer exécuté à l'intérieur d'un thread, il doit être créé à l'intérieur de la méthode 'Execute()' du thread à la place, puis le thread a besoin de sa propre boucle de messages pour que les messages 'WM_TIMER' soient distribués correctement. pas thread-safe (en raison de son utilisation de 'AllocateHWnd()' en interne), donc vous devriez utiliser directement SetTimer() ', ou même un timer waitable via' CreateWaitableTimer() ', une minuterie multimédia via' timeSetEvent() ' , ou même simplement une boucle de veille manuelle –

+0

Oui, le timer a été créé dans le constructeur du Thread Merci pour les explications – Holgerwa

Questions connexes