Mein Server muss einige Berichte über seine Arbeit drucken. Wie kann ich visuelle Objekte wie Beschriftungen und Bearbeitungsfelder im OneEecute-Ereignis verwenden?Wie verwenden Sie visuelle Kontrollen in Indy? (Delphi)
3
A
Antwort
3
Die gleiche Regel, um VCL-Objekte in keinem Thread außer dem Hauptthread zu ändern, ist auch hier gültig. Sie sollten keines der VCL-Steuerelemente im OnExecute-Event-Handler ändern, da dieser Code im Kontext eines Worker-Thread-Spawns von Indy für jede Verbindung ausgeführt wird.
Wenn Sie die grafische Benutzeroberfläche ändern müssen, verwenden Sie die Methoden Synchronize oder Queue oder verwenden Sie einen benutzerdefinierten Benachrichtigungsmechanismus, um den Hauptthread über die Änderung der GUI für Sie zu informieren.
Wenn Sie Methoden synchronisieren oder Queue rufen, müssen Sie TIdYarn zu TIdYarnOfThread-Typ gegossen, die aus TIdYarn leitet und setzt sie mit einem Gewinde:
// 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);
TThread hat statisch synchronisieren() und Queue() -Methoden in D7 +, so dass Sie nicht direkt auf die Interna des Garns zugreifen müssen. Alternativ können Sie stattdessen Indys TIdSync- und TIdNotify-Klassen verwenden, die diese Details für Sie behandeln. –
@Remy, danke; speziell für TIdSync und TIdNotify in Indy; Ich wusste nichts von ihnen. – vcldeveloper
Verwenden Sie TidNotify am besten, da TidSynch Deadlocks verursachen kann, wenn der Haupt-vcl-Thread auf das Beenden des Worker wartet und der Worker darauf wartet, dass die Tidsynch-Methode im Haupt-vcl-Thread endet. – MikeT