2009-01-13 16 views

Antwort

11

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

Es ist jedoch nicht notwendig, Nachrichten zu verwenden, um mit einem Thread zu kommunizieren. Warten Sie einfach auf ein Ereignisobjekt (TEvent in VCL) und signalisieren Sie dieses Ereignis, wenn der Thread eine Funktion ausführen soll.

Aber wenn Sie neu in Multi-Threading - gehen Sie nicht in alle diese Details auf eigene Faust, es sei denn, Sie für den Lerneffekt zu wollen. Verwenden Sie einfach die OmniThreadLibrary und fertig damit. Es gibt viel Gutes zu lernen, wenn man sich in seine Interna vertieft, sobald man weiß, wie man es benutzt.

Edit:

Siehe auch die Antworten auf this question, die sehr ähnlich ist.

Edit 2:

In Bezug auf den Kommentar zu fragen: "Was ist [OmniThreadLibrary] zu erleichtern, 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 einige Beispiele, um die Konzepte zu veranschaulichen, aber für ein schnelles "reales Leben" Beispiel können Sie sich ansehen this blog post - Sie müssen nicht einmal die Bibliothek dafür installieren.

ich auch damit einverstanden, dass eine Bibliothek für Multi-Threading unter Verwendung erfordert einen gewissen Akt des Glaubens. OTOH, das mit dem kommt, was die VCL bietet, ist kaum eine Alternative. Der Beispielcode verwendet weiterhin den falsch konzipierten Aufruf von Synchronize(). Es gibt keine Unterstützung für Dinge wie Thread-sichere Producer-Consumer-Queues, die viel besser für Multi-Thread-Programmierung geeignet sind. Und wenn Sie zustimmen, dass Sie ein solideres Fundament für Ihre Multithread-Programme benötigen, als die VCL bietet - warum erfinden Sie dieses spezielle Rad neu?

Da die Kosten für die Bibliothek verwenden: Sie müssen sich Zeit, ob es schnell genug für Sie ist. Es abstrahiert die Kommunikation zwischen Threads auf eine gute Weise IMHO, aber jede Abstraktion kostet natürlich Leistung.

Wenn Sie sich entscheiden, dass es nicht für Sie, nachdem alle - den Code selbst schreiben. Ich habe das gleiche für Delphi 4 getan, und ich benutze diesen Code seit fast 10 Jahren. Und nach der Menge der Bugs zu urteilen, die ich in dieser Zeit gefunden habe, würde ich definitiv jedem, der neu zu Multithreading ist, raten, nicht zu schreiben, um seinen eigenen Bibliothekscode dafür zu schreiben. Und wenn Sie wirklich wirklich wollen, nehmen Sie bitte die Regeln in this posting zu Herzen.

+0

In der Tat verwenden OmniThreadLibrary –

+0

Ich bin in der gleichen Situation wie das OP. Ich weiß zu wenig, um zu wissen, was OmniThreadLibrary für mich tut, außer "es einfacher zu machen". Was macht es einfacher und zu welchen Kosten? Außerdem gibt es das Thema "undichte Abstraktionen" - wenn etwas schief geht, wird die Lib die Sicht auf das Problem behindern. –

+0

OTL macht etwas Ähnliches wie die VCL - es verbirgt die inhärente Hässlichkeit der Arbeit direkt mit Threads von Ihnen. Es erlaubt Ihnen auch, direkt mit den zugrundeliegenden Windows-Primitiven zu arbeiten, so viel wie Sie möchten (wieder wie die VCL). Weitere Informationen finden Sie unter http://otl.17slon.com/forum. – gabr

-1

Wenn Sie einen Verweis auf das Thread-Objekt haben, können Sie es einfach anrufen lenken, und die Prozedur speichern Informationen haben oder entsprechend aktualisieren. Offensichtlich müssen Sie vorsichtig sein, um Dinge auf eine thread-sichere 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 App, wo Threads bestimmte Zwecke haben und eine Thread-ID zugewiesen sind.Jeder Thread kann eine Nachricht mit einer Nachrichten-ID und einer Zeichenfolge für Parameter an eine andere Thread-ID "posten" und dann mit seiner Arbeit fortfahren. Der andere Thread nimmt es in seiner Freizeit auf und handelt entsprechend.