Как использовать визуальные элементы управления в Indy?(Delphi) - PullRequest
3 голосов
/ 30 ноября 2010

Мой сервер должен распечатать некоторые отчеты о своей работе. Как я могу использовать визуальные объекты, такие как метки, поля редактирования в событии OneEecute?

1 Ответ

3 голосов
/ 30 ноября 2010

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

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

Если вы хотите вызвать методы Synchronize или Queue, вам нужно привести тип 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);
...