TIdHttpServer синхронизируется с VCL
Я использую TIdHttpServer для обработки некоторых команд, проблема в том, что некоторые команды теряются, я предполагаю, что это связано с тем, что я обновляю vcl внутри OnConnect.
Как я могу использовать метод Синхронизировать, чтобы Safley обновить VCL?
2 ответа
Это достаточно просто, просто позвоните TThread.Synchronize()
с чем угодно TThreadMethod
Вы хотите быть вызванным потоком GUI. TThreadMethod
без параметров procedure of object
, но поскольку вторичный поток, выполняющий вызов, блокируется до тех пор, пока поток GUI не выполнит синхронизированный метод, вы можете использовать TThread
члены синхронизированного метода без какой-либо дополнительной защиты.
Просто для полноты, я должен упомянуть, что есть несколько альтернатив, все из которых лучше (даже те, которые я не пробовал, потому что ничто не может быть хуже). Инди имеет TIdSync
а также TIdNotify
классы, которые вы можете получить для переноса переменных и реализации пользовательских методов. Более новые версии Delphi имеют TThread.Queue()
а также TThread.ForceQueue()
которые могут использовать анонимные методы для генерации замыканий (с захваченными переменными), которые могут выполняться потоком GUI без блокировки вызывающего потока. Также есть PostMessage()
а также PostThreadMessage()
API - это система связи, которая работала без изменений после D3/W95 и наверняка будет доступна в Windows навсегда.
У индии есть своя TIdSync
а также TIdNotify
классы для синхронизации с основным потоком синхронным и асинхронным образом, соответственно. Получите новый класс от TIdSync
и переопределить его DoSynchronize()
метод или производный от TIdNotify
и переопределить его DoNotify()
метод.
Обновление: обратите внимание, что в настоящее время эти классы в значительной степени устарели в пользу собственных статических версий Delphi TThread.Synchronize()
а также TThread.(Force)Queue()
методы, которые делают ту же работу, что TIdSync
/TIdNotify
были изначально разработаны для назад, когда TThread
до сих пор поддерживается только нестатический Synchronize()
,