2010-11-30 2 views

ответ

3

То же самое правило для не изменяющих объектов VCL в любом потоке, кроме основного потока, также здесь. Вы не должны изменять какой-либо элемент управления VCL в обработчике событий OnExecute, потому что этот код будет запущен в контексте рабочего потока, созданного Indy для каждого соединения.

Если вам нужно изменить графический интерфейс пользователя, сделайте это с помощью методов синхронизации или очереди или используйте специальный механизм уведомления для уведомления основного потока о внесении изменений в графический интерфейс пользователя.

Если вы хотите вызвать Синхронизировать или Очередь методу, вы должны ввести отливку TIdYarn к TIdYarnOfThread, которая вытекает из TIdYarn и реализует его с потоками:

// Calling MyMethod using Synchornize inside TIdTcpServer.OnExecute event-handler 
TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MyMethod); 


// Calling MyMethod using Queue inside TIdTcpServer.OnExecute event-handler 
TIdYarnOfThread(AContext.Yarn).Thread.Queue(MyMethod); 
+3

TThread имеет статические Синхронизировать() и Queue() методы в D7 +, поэтому вам не нужно напрямую обращаться к внутренним компонентам пряжи. Кроме того, вместо этого используйте классы Indy's TIdSync и TIdNotify, которые обрабатывают эти данные для вас. – 2010-11-30 22:04:18