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(),

Другие вопросы по тегам