Почему TidTCPClient в отдельном потоке блокирует основной поток? - PullRequest
0 голосов
/ 22 марта 2011

Отдельный поток создает TidTCPClient и TTimer.TTimer имеет значение 3 с, и если TCPClient не подключен, он вызывает TCPClient.Connect.
Если нет сервера для подключения, это приводит к попытке подключения каждые 3 секунды.

Основной поток (UI) ничего не делает, но если я схватил окно мышью и медленно переместил его по экрану, он зависает каждые 3 секунды примерно на 2 секунды, затем он переходит в положение курсора мыши и снова следует за мышью, до следующей попытки подключения.

Другими словами, основной поток кажется заблокированным, когда TCPClient пытается подключиться.

Почему это происходит, даже если TCPClient находится вэто отдельная тема?

1 Ответ

6 голосов
/ 22 марта 2011

Ваш TTimer работает, получая сообщения WM_TIMER; Эти сообщения отправляются с использованием основного модуля обработки сообщений VCL в потоках VCL. По истечении 3 секунд событие TTimer.OnTimer запускается в основном потоке , поэтому вызов Connect выполняется в основном потоке VCL.

Вы заблокированы, потому что у вас нет потоков!

...