Perché un tidtcpclient in un thread separato blocca il thread principale?
-
28-10-2019 - |
Domanda
Un thread separato crea un tidtcpclient e un ttimer. Il TTimer è impostato su 3S e se il TCPClient non è collegato, chiama TCPClient.Connect.
Se non esiste un server a cui connettersi, ciò si traduce nel tentativo di connettersi ogni 3 secondi.
Il thread principale (UI) non fa nulla, ma se afferro la finestra con il mouse e lo muovo lentamente sullo schermo, si blocca ogni 3 secondi per circa 2 secondi, quindi salta in posizione di to-cursor del mouse e segue il mouse Ancora una volta, fino a quando non si verifica il successivo tentativo di connessione.
In altre parole, il thread principale sembra essere bloccato quando TCPClient cerca di connettersi.
Perché ciò accade, anche se il tcpclient è nel suo thread separato?
Soluzione
Il tuo TTimer funziona ricevendo messaggi WM_TIMER; Tali messaggi vengono spediti utilizzando la pompa del messaggio principale del VCL, nei thread VCL. Dopo i 3 secondi scadono il tuo evento TTimer.ontimer nel thread principale, quindi la chiamata a Connect
funziona nel thread VCL principale.
Vieni bloccato perché non stai infilando!