diff --git a/TCIServer.pas b/TCIServer.pas index c639b7c..e6bb7f6 100644 --- a/TCIServer.pas +++ b/TCIServer.pas @@ -1009,9 +1009,23 @@ begin Continue; end; + // Счётчик — ДО старта: иначе Stop успел бы проскочить шаг 4 между Start и + // первой строкой потока. ★А не родился поток (память, лимит потоков) — + // сразу возвращаем счётчик назад: ждут его на шаге 4 без таймаута, и + // лишняя единица подвешивала бы и выход из программы, и любую смену + // настроек TCI. Объект потока уносит себя сам: упавший конструктор — сразу, + // а поднявшийся — по FreeOnTerminate. InterLockedIncrement(FThreadCount); - T := TTCIClientThread.Create(Self, Client); - T.Start; + try + T := TTCIClientThread.Create(Self, Client); + T.Start; + except + InterLockedDecrement(FThreadCount); + // Обслуживать клиента больше некому: гасим сокет и метим на освобождение + // — заберёт тик-поток (ReapClients), как и обычное отключение. + Client.Kill; + Client.FClosed := True; + end; end; end;