Thread-Kommunikation mit SendMessage
meine Frage ist : wie kann ich mit SendMessage() zu implementieren thread Kommunikation zwischen zwei threads, einer mit einem Fenster (GUI) und das andere ohne Fenster?
Das problem ist, dass die SendMessage() muss ein handle (HWND)?
Weiteres detail über mein Projekt : Zwei threads, einer läuft managed code (der mit der Benutzer-Schnittstelle), und der andere läuft native code (die ohne Fenster)
Vielen Dank!
SendMessage ist eine unglaublich gefährliche Funktion zu verwenden, die in einer multi-Threading-Umgebung, da ist es nicht thread-sicher und können in der Folge zu deadlocks (ich spreche aus Erfahrung).
InformationsquelleAutor | 2009-01-16
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde vorschlagen, die Schaffung eines versteckten Fenster. Bei der Verwendung von postthreadmessage, gibt es eine chance, dass Ihre Nachricht konnte verloren gehen (sprich: wenn eine messagebox mit der message-loop).
Mehr Infos unter:
http://blogs.msdn.com/oldnewthing/archive/2005/04/26/412116.aspx
InformationsquelleAutor Bob
Vielleicht sollten Sie versuchen, zu verwenden PostMessage oder PostThreadMessage
Nein. Es wäre nicht allzu schwer zu implementieren, die eine blockierende version - mit PostThreadMessage, und dann dem aufrufenden thread blockieren, auf ein Ereignis, das der angerufene wird gesetzt, wenn es die Nachricht verarbeitet hat
InformationsquelleAutor schnaader
Falls der thread hat keine Fenster, keine message-queue und keine message dispatcher, dann ist es wird schwer sein, eine Nachricht an Sie. Es ist üblich, threads zu erstellen versteckte windows nur zum Zwecke der Kommunikation (werfen Sie einen Blick mit Windows Spy und sehen Sie viele Beispiele).
Eine alternative ist die Verwendung von shared memory und Synchronisation primitiven, wie ein Ereignis oder semaphore. Eine weitere alternative ist die Verwendung von pipes.
InformationsquelleAutor jdigital
was @jdigital sagte. Beachten Sie, dass wenn Sie ein ausgeblendetes Fenster, und euer thread nicht bereits implementieren Sie eine message-loop (entweder in der gewöhnlichen win32-sprechen, oder ein in den Kontext des COM-STA -- und wenn Sie keine Ahnung haben was ich spreche, dann vllt existiert nicht in deinem thread), werden Sie auch wollen, um eine Nachricht zu erstellen Schleife sowie. ATL macht es ziemlich einfach mit
_AtlModule.RunMessageLoop();
Leider bedeutet dies auch den thread in Frage ist wahrscheinlich gehen zu müssen, um sein event-driven, während es in der Mitteilung Schleife. Sie können tun, heikle Dinge wie MsgWaitForMultipleObjects, aber es wird haarig.Hier ist ein Beispiel hidden windows wenn Sie vertraut sind mit ATL/COM. Ich ging durch diesen Schmerz eine Weile zurück und dachte, es war eine nützliche Diskussion über microsoft.öffentlichkeit.vc.atl, aber die beste, die ich finden kann ist jetzt dieser Beitrag. die geht in einige Details über die Varianten des message-loops (was anders machen, wenn Sie Beschleuniger Tastenanschlag oder nicht-modales Fenster, klingt wie Sie nicht in der Anwendung).
InformationsquelleAutor Jason S