Thread Kommunikation
-
Ich starte über einen Button einen Thread (
AfxBeginThread
) aus meinem Dialog heraus. Nun möchte ich das in diesem Thread ein Static Text in meinem Dialog verändert wird. Also rufe ichSetDlgItemText(IDC_STATIC, "Hallo");
auf. Leider bekomme ich dann immer den Fehler:error C2660: 'SetDlgItemTextA' : Funktion akzeptiert keine 2 Parameter
Wie kann ich denn von meinem Thread aus auf Methoden des Dialogs zugreifen?
-
Entweder Du gibst den Zeiger oder das Handle auf deinen Dialog mit in den Thread, was ich nicht gut finde, weil das meist schief geht. Oder du sendest eine UserMessage an den Dialog und der aktualisiert dein Static. Aber ich denke zu beiden Varianten wirst du beispiele im Netz finden
-
Also das ist jetzt vielleicht ne blöde Frage, aber wie bekomme ich denn das Handle meines Dialogs? Ich dachte immer dass "IDD_DIALOG" das Handle wäre, aber damit meckert er. Warum geht denn das meistens schief?
Zu der zweiten Lösung finde ich leider kein gutes Beispiel. Geht dass denn dann auch wenn ich ständig aktualisieren muss? Also im Grunde lass ich ne Schleife laufen die alle paar ms den Text ändert. Klappt das dann auch noch so? Hättest du vielleicht ein Beispiel? Oder nen Link zu nem Beispiel?
-
Also ich hab jetzt ein Beispiel gefunden, auf:
http://www.ucancode.net/Visual_C_MFC_Example/WaitForSingleObject-_beginthreadex-SetEvent-Start-Stop-Thread-VC-MFC-Example.htm
gibt es ziemlich in der Mitte der Seite eins.Ich hab das so probiert, aber er meckert immer dass "WM_USER_..." nicht deklariert wäre, obwohl ich es im stdafx.h definiert habe. Jemand nen Plan woran das liegt?
-
Ist doch in dem Beispiel alles Beschrieben, auch wenn es sehr Ausführlich ist. Wenn das mit dem WM_USER_... nicht zu finden ist, dann schau doch mal ob auch die stdafx.h in deiner Dialogklasse eingebunden wird.
-
Ja ist drin. Muss ich denn das #define in der stdafx.h an eine bestimmte Stelle schreiben, oder ist das egal? Ich habs so gemacht
`...
#if !defined(AFX_STDAFX_H__C89083D2_7770_427B_8145_EC9B67CF7D0C__INCLUDED_)
#define AFX_STDAFX_H__C89083D2_7770_427B_8145_EC9B67CF7D0C__INCLUDED_
#define WM_USER_STATIC_PROGRESS WM_USER + 1
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
...`
Passt das?
-
Hier mal ein paar Code Auszüge, vielleicht findet ja wer den Fehler.
stdafx.h
... #if !defined(AFX_STDAFX_H__C89083D2_7770_427B_8145_EC9B67CF7D0C__INCLUDED_) #define AFX_STDAFX_H__C89083D2_7770_427B_8145_EC9B67CF7D0C__INCLUDED_ #define WM_USER_STATIC_PROGRESS WM_USER + 1 #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 ...
MyDlg.h
... // Implementierung protected: // Generierte Nachrichtenzuordnungsfunktionen //{{AFX_MSG(CRandomDlg) ... afx_msg void OnPaint(); afx_msg void OnStaticProgress(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ...
MyDlg.cpp
... BEGIN_MESSAGE_MAP(CRandomDlg, CDialog) //{{AFX_MSG_MAP(CRandomDlg) ... ON_MESSAGE(WM_USER_STATIC_PROGRESS, OnStaticProgress) //}}AFX_MSG_MAP END_MESSAGE_MAP() ... void CRandomDlg::OnStaticProgress() { Sleep(500); } ...
Fehler:
error C2065: 'WM_USER_STATIC_PROGRESS' : nichtdeklarierter Bezeichner
Bitte helft mir, ich weis echt nicht was ich falsch mache. Ich nutze übrigens VC6.
-
Okay, ich habs jetzt doch endlich selbst geschafft. Nach ewigem rum probieren habe ich herausgefunden dass das #define nicht in stdafx.h sondern in MyDlg.h gehört.
Nun habe ich aber das Problem dass ich nicht weis wie ich die neue Methode aus dem Thread heraus aufrufe. Mit OnStaticProgress(); funktioniert es nicht weil er sich dann beschwert dass das undefiniert ist. Kann mir wenigstens beim Aufruf aus dem Thread jemand helfen???? Das wäre wirklich sehr nett!
-
der define muß auch in der stdafx.h gehn, mach ich auch immer so, ich nehm an du hast die stdafx.h nicht im deiner Dialog.cpp includet.
Aufrufen geht doch ganz einfach:
::PostMessage( m_hWnd, WM_USER_STATIC_PROGRESS, 0, 0 );
wobei m_hWnd das Handle auf deinen Dialog ist was du dem Thread mitgeben solltest
über die 2 letzten Parameter könntest du noch daten mitsenden.
des weiter wirde ich OnStaticProgress so definieren
h: afx_msg LRESULT OnStaticProgress( WPARAM, LPARAM ); cpp: LRESULT CRandomDlg::OnStaticProgress( WPARAM, LPARAM ) { }
-
Oh man, danke! Das war echt mal ne schwere Geburt. Jetzt klappt aber alles. Vielen, vielen Dank!
edit: Abgesehen von dem #define, das geht wirklich nur wenn ich es in MyDlg.h reinschreibe, obwohl ich den stdafx.h im MyDlg.cpp includiert hatte. Das ist mir jetzt aber auch egal, hauptsache es funzt.
-
ich hab das auch so definiert und da geht das eigentlich
#if !defined(AFX_STDAFX_H__9557B695_4A43_4491_977E_6E9B04802D66__INCLUDED_) #define AFX_STDAFX_H__9557B695_4A43_4491_977E_6E9B04802D66__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 //################################################################## //User Messages #define UM_NEWFILM (WM_USER+1) #define UM_DISPLAYFILM (UM_NEWFILM+1) #define UM_PLAYMEDIAFILE (UM_DISPLAYFILM+1) #define UM_PLAYLISTPLAY (UM_PLAYMEDIAFILE+1)