При вызове Thrd.Free
запускается следующий код из TThread.Destroy
:
Terminate;
if FCreateSuspended then
Resume;
WaitFor;
Вызов Free
для потока, таким образом, завершит поток синхронно.
Я предполагаю, что звонок на WaitFor
никогда не возвращается. Возможно TCaptureThread.Execute
не проверяет Terminated
и завершает работу. Возможно, TCaptureThread
ожидает в главном потоке и ожидание тупика в потоке.
Довольно сложно сделать что-либо кроме угадывания, основываясь на вашем вопросе, но я бы хотел проверить, проходит ли ваш код вызов WaitFor
при уничтожении Thrd
. Включите отладку DCU, установите точку останова при вызове на WaitFor
и убедитесь сами.