WinAPI: Sendmessage von Thread an Hauptfenster

Gast #2155945
Lesenswert?

Hallo,

ich versuche mich seit 2 Tagen an WinAPI.

Wie kann ich von einem erstellten Thread eine Nachricht an das 
übergeordnete Fenster schicken? Ich suche schon seit Stunden im Internet 
wie ich den Handle (hwnd) des Hauptfensters dem Thread übergeben kann. 
Danach kann ich doch einfach mit Sendmessage() die Nachricht schicken 
oder?

Danke ;)
Gast #2155960
Lesenswert?

Klar kannst du SendMessage auch aus einem Thhread heraus aufrufen. Den 
Window-Handle kannst du z.B. hier ermitteln

http://support.microsoft.com/kb/242308

Denke daran, dass SendMessage asynchron arbeitet, d.h. dass die 
entsprechende Funktion nicht direkt aufgerufen wird, sondern vom 
Hauptthread der Anwendung mit seiner Botschaften-Schleife an die Fenster 
gesendet wird (an deren Window-Funktion).

Das funktioniert auch nur in einer GUI-Anwendung.

Uebrigens kannst du mit SendMessage auch einem Thread eine asynchrone 
Botschaft senden.
#2155975
Lesenswert?

Atomek schrieb:
> Uebrigens kannst du mit SendMessage auch einem Thread eine asynchrone
> Botschaft senden.

hö, Nachrichten kann man doch nur an Fenster schicken, oder?
Ich hatte nämlich auch schon mal gesucht, ob das geht, hab dann aber ein 
unsichtbares Dummyfenster gebaut.

SendMessage ist übrigens ein synchroner Aufruf.
Wie das bei unterschiedlichen Threads ausseiht weiß ich aber ernicht.

die asynchrone Variante ist PostMessage
Gast #2156145
Lesenswert?

Vlad Tepesch schrieb:
> SendMessage ist übrigens ein synchroner Aufruf.
> Wie das bei unterschiedlichen Threads ausseiht weiß ich aber ernicht.
>
> die asynchrone Variante ist PostMessage

Genau das ist mir gerade auch eingefallen. PostMessage ist 
Fire-And-Forget und bei Threads ueblich. Waerend SendMessage synchron 
ist. Von SendMessage ist abzuraten zwischen Threads.

Details hier: 
http://msdn.microsoft.com/en-us/library/ms644950(v=vs.85).aspx
Gast #2156262
Lesenswert?

bluppdidupp schrieb:
> http://msdn.microsoft.com/en-us/library/ms682453(v=vs.85).aspx
> über lpParameter kann man beliebige Daten dem Thread mitgeben.
> z.B. einen Zeiger auf nen Struct/Objekt wo man alles was der Thread so
> brauchen könnte reinpacken könnte...
>
> Bei _beginthread/_beginthreadex hat man arglist dafür.

Aber hier bitte beachten: Wenn man CreateThread benutzt wird die C-RTL 
nicht korrekt initialisiert, also kann man sie nicht benutzen oder muss 
seine eigene C-Laufzeitbibiothek bauen, die damit kein Problem hat. Viel 
Spass dabei... ;-)

_beginthread und Konsorten oder etwas aus MFC sind also mehr oder 
weniger Pflicht.

Und Atomek hat Recht, SendMessage zwischen Threads führt ganz schnell zu 
Deadlocks.

Ganz genau genommen lautet die Regel: Fenster werden nur von ihrem 
Thread aus manipuliert, d.h. Messages von einem Fremdthread  zu senden 
ist generell bähh.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren