Frage

Gibt es eine Dokumentation zur Cross-Thread-Kommunikation in Delphi?Wie kann ich eine Nachricht an den Thread senden, der kein Fenster hat?

War es hilfreich?

Lösung

Sie können (Windows-)Nachrichten nur an Threads senden, die eine Standard-Nachrichtenschleife implementieren, die automatisch erstellt wird, sobald ein Fensterhandle realisiert wird.

Es ist jedoch nicht notwendig, Nachrichten für die Kommunikation mit einem Thread zu verwenden.Lassen Sie es einfach auf ein Ereignisobjekt (TEvent in VCL) warten und signalisieren Sie dieses Ereignis, wenn der Thread eine Funktion ausführen soll.

Aber wenn Sie mit Multithreading noch nicht vertraut sind, gehen Sie nicht alleine auf alle diese Details ein, es sei denn, Sie möchten dies aus Lerneffekten tun.Benutzen Sie einfach die OmniThreadLibrary und sei damit fertig.Wenn man erst einmal weiß, wie man es benutzt, kann man viel Interessantes lernen, wenn man sich mit dem Inneren befasst.

Bearbeiten:

Siehe auch die Antworten auf diese Frage was sehr ähnlich ist.

Bearbeiten 2:

In Bezug auf den Kommentar: "Was macht [Omnithreadlibrary] einfacher und zu welchem ​​Preis?" Ich kann Ihnen nur raten, es selbst zu überprüfen - das heißt, wenn Sie mindestens Delphi 2007 verwenden.Es gibt mehrere Beispiele zur Veranschaulichung der Konzepte, aber für ein schnelles Beispiel aus dem „realen Leben“ können Sie einen Blick darauf werfen dieser Blogbeitrag - Sie müssen dafür nicht einmal die Bibliothek installieren.

Ich stimme auch zu, dass die Verwendung einer Bibliothek für Multithreading einen gewissen Glaubensakt erfordert.Es ist kaum eine Alternative, sich mit den Angeboten des VCL zufrieden zu geben.Der Beispielcode verwendet immer noch den schlecht durchdachten Synchronize()-Aufruf.Es gibt keine Unterstützung für Dinge wie threadsichere Produzenten-Konsumenten-Warteschlangen, die viel besser für die Multithread-Programmierung geeignet sind.Und wenn Sie der Meinung sind, dass Sie eine solidere Grundlage für Ihre Multithread-Programme benötigen, als die VCL bietet – warum sollten Sie dann dieses spezielle Rad neu erfinden?

Zu den Kosten für die Nutzung der Bibliothek:Ob es für Sie schnell genug ist, müssen Sie selbst abschätzen.Meiner Meinung nach abstrahiert es zwar die Kommunikation zwischen Threads auf gute Weise, aber jede Abstraktion kostet natürlich Leistung.

Wenn Sie entscheiden, dass es doch nichts für Sie ist, schreiben Sie den Code selbst.Ich habe dasselbe für Delphi 4 gemacht und verwende diesen Code nun seit fast 10 Jahren.Und gemessen an der Menge an Fehlern, die ich in dieser Zeit gefunden habe, und an Eckfällen, die ich erlebt habe, würde ich definitiv jedem, der neu im Multithreading ist, dazu raten nicht Schreiben Sie ihren eigenen Bibliothekscode dafür.Und wenn Du wirklich wirklich Wenn Sie möchten, beachten Sie bitte die Regeln diesen Beitrag zu Herzen.

Andere Tipps

Die Frage Delphi Multi-Threading-Nachrichtenschleife enthält auch einige Beispiele die Kommunikation zwischen Threads

Wenn Sie einen Verweis auf das Thread-Objekt haben, können Sie es einfach direkt anrufen, und haben die Prozedur speichert Informationen oder entsprechend aktualisieren. Offensichtlich muss man vorsichtig sein, die Dinge in einem Thread sichere Art und Weise zu tun.

Alternativ können Sie ein zentrales Steuerobjekt, durch die Verwendung die Fäden kommunizieren, wenn sie nicht beschäftigt sind. Ich habe eine Anwendung, wo Fäden bestimmte Zwecke haben und sind ein gewinde ID zugeordnet. Jeder Thread kann „post“ eine Nachricht mit einer Message-ID und einer Zeichenkette für Parameter auf einem anderen Thread-ID und dann wieder mit seiner Arbeit. Die anderen Fäden nehmen es in seiner Freizeit auf und handelt entsprechend.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top