¿Por qué un TidtcpClient en un hilo separado bloquea el hilo principal?
-
28-10-2019 - |
Pregunta
Un hilo separado crea un TidtcpClient y un timer. El ttimer se establece en 3s y si el TCPClient no está conectado, llama tcpClient.connect.
Si no hay un servidor al que conectarse, esto da como resultado un intento de conectarse cada 3 segundos.
El hilo principal (UI) no hace nada, pero si agarro la ventana con el mouse y lo muevo lentamente a través de la pantalla, se atasca cada 3 segundos durante aproximadamente 2 segundos, luego salta a la posición del ratón y sigue el mouse Nuevamente, hasta que ocurra el próximo intento de conectarse.
En otras palabras, el hilo principal parece estar bloqueado cuando el TCPClient intenta conectarse.
¿Por qué sucede esto, a pesar de que el TCPClient está en su hilo separado?
Solución
Su timer funciona recibiendo mensajes WM_TIMER; Esos mensajes se envían utilizando la bomba de mensaje principal del VCL, en los hilos de VCL. Después de los 3 segundos, caduca su evento ttimer.ontimer se ejecuta en el hilo principal, entonces la llamada a Connect
Funciona en el hilo VCL principal.
¡Te bloquean porque no estás roscando!