При открытых соединениях IdTCPServer.Active: = false;вызывает зависание программы.
Единственный способ, который может произойти, это если вы заблокируете сервер.
Это может произойти, если вы деактивируете сервер из контекста вашего основного интерфейса пользователя.поток, в то время как обработчики событий вашего сервера синхронно синхронизируются с основным потоком пользовательского интерфейса одновременно (TIdSync
, TThread.Synchronize()
, SendMessage()
и т. д.).
Это также может произойтиесли ваши клиентские потоки делают что-то, что не является потокобезопасным, например, обращаются к пользовательскому интерфейсу без надлежащей синхронизации.
Деактивация сервера закрывает все активные сокеты и ожидает завершения их потоков.Но если один или несколько клиентских потоков заблокированы в ожидании основного потока пользовательского интерфейса или заблокированы каким-либо другим способом, а основной поток пользовательского интерфейса заблокирован в ожидании деактивации сервера, то это тупик, который приводит к зависанию программы.
Чтобы обойти это, вам нужно убедиться, что ваш серверный код является поточно-ориентированным, и что вы либо:
используете асинхронные syncs (TIdNotify
, TThread.Queue()
, PostMessage()
и т. Д.), Чтобы клиентские потоки не блокировались в ожидании основного потока пользовательского интерфейса.
деактивировать сервер из рабочего потока, чтобы основной пользовательский интерфейспоток может свободно обрабатывать запросы синхронизации.