Zum Inhalt springen

PostMessage(), MessageMap und wie man die Nachricht abfängt...


Filou

Empfohlene Beiträge

Hi,

ich habe immernoch das Problem mit meinem Thread.

Ich habe jetzt gelesen dass man das über die PostMessage() macht.

Ich sende also jetzt

pWnd->PostMessage(WM_THREAD_END, 0, 0);
in meinem Thread wenn dieser beendet wird. Definiert ist die Nachricht so:
#define WM_THREAD_END    WM_APP + 1
Dann habe ich einen Eintrag in BEGIN_MESSAGE_MAP hinzugefügt. So wie es der Klassenassistent bei WM_KEYDOWN macht.
BEGIN_MESSAGE_MAP(CScannenDlg, CDialog)

	//{{AFX_MSG_MAP(CScannenDlg)

	WM_THREAD_END()

	//}}AFX_MSG_MAP

END_MESSAGE_MAP()
In der MessageMap habe ich meine Nachricht auch bekannt gemacht. So:
#define WM_THREAD_END() \

	{ WM_THREAD_END, 0, 0, 0, AfxSig_vwww, \

		(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(void))&OnThreadEnd },

Dann habe ich noch die Funktion angelegt die Aufgerufen werden soll wenn der Thread beendet ist. So:
void CScannenDlg::OnThreadEnd() 

{

	MessageBox("TEST")	;

}

Aber ich komme nie an meiner MessageBox an.

Irgendwas muss noch falsch sein.

Könnt Ihr mir bitte helfen?

PPS:

Jetzt habe ich es so, dass WM_THREAD_END in BEGIN_MESSAGE_MAP bekannt ist,

allerdings nicht im Thread. pWnd->PostMessage(WM_THREAD_END, 0, 0);

Das mag er nicht....

Obwohl es ja in AFXMSG_.H definiert ist und auch im Dialog bekannt zu sein scheint.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Fällt dir was auf? Es ist sicher nicht gut, wenn dein Messagemap-Makro genauso geschrieben wird wie deine Nachricht.

Du brauchst auch gar kein eigenes Makro. Du kannst das mit ON_MESSAGE machen.

Danke für Deine Antwort Klotzkopp :)

Ja ich habe entdeckt dass es daran gelegen hat dass es bei BEGIN_MESSAGE_MAP nicht geklappt hat.

Das habe ich rausgenommen. aber dafür war das Define nicht mehr in dem Thread bekannt.

Was meinst Du das mit ON_MESSAGE? Wenn ich das Verwende muss ich es doch irgendwie meiner Funktion zuweisen, dass die Funktion aufgerufen wird wenn der Thread beendet ist. Wie mache ich das?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was meinst Du das mit ON_MESSAGE? Wenn ich das Verwende muss ich es doch irgendwie meiner Funktion zuweisen, dass die Funktion aufgerufen wird wenn der Thread beendet ist. Wie mache ich das?

Steht in der MSDN Library:

ON_MESSAGE(WM_THREAD_END, DeineMemberFunktion)

Die Funktion muss so aussehen:

afx_msg LRESULT DeineMemberFunktion( WPARAM wParam, LPARAM lParam);

Und es muss natürlich eine nichtstatische Memberfunktion der Klasse sein, zu der die Messagemap gehört.

Die Namen den Parameter sind wurscht. Da drin landen Parameter 2 und 3 von Post-/SendMessage.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...