Dialogklasse und Thread
-
Hi Leute,
ich habe eine Anwendung mit einer Dialogklasse vom Typ CDialog und einer einer Threadklasse vom Typ CwinThread. Jetzt möchte ich aus der Threadfunktion etwas in die Editbox der Dialogklasse schreiben. Also so:
BOOL CMyThread::InitInstance()
{CDialogThreadDlg::m_edit = "Test"; //hier in die Editbox schreiben
return TRUE;
}Dabei bekomme ich die Fehlermeldung:
error C2597: Ungültiger Verweis auf nicht-statischen Member 'CDialogThreadDlg::m_edit'
Die Header Datei der Dialogklasse habe ich eingebunden.
Könnt Ihr nir helfen?
Danke im voraus.
Grüssse
xthing
-
Du musst dem Thread einen Zeiger auf Dein Dialog oder Edit übergeben.
-
Airdamn schrieb:
Du musst dem Thread einen Zeiger auf Dein Dialog oder Edit übergeben.
wenn sich mfc-klassen gegenseitig aus unterschiedlichen threads aufrufen, kann das in's auge gehen. besser: mit ::SendMessage(hwnd_des_editcontrols,...) arbeiten.
-
xthing schrieb:
CDialogThreadDlg::m_edit = "Test"; //hier in die Editbox schreiben
Wieso hier "::" und nicht "."? Ist m_edit ein statischer Member Deiner Klasse? Zu Deinem eigentlichen Problem: zum Thema Dialog und Thread gab es hier schon genug Beiträge, einfach mal die Suchfunktion bemühen.
-
Hi, danke für den Hinweis. Kannst Du mir das etwas genauer schildern. Wie bekomme ich den hwnd des Editfeldes und mit welchen Parametern muss ich ::SendMessage aufrufen.
Vielen Dank noch mal.
Grüsse
xthing
-
net schrieb:
Airdamn schrieb:
Du musst dem Thread einen Zeiger auf Dein Dialog oder Edit übergeben.
wenn sich mfc-klassen gegenseitig aus unterschiedlichen threads aufrufen, kann das in's auge gehen. besser: mit ::SendMessage(hwnd_des_editcontrols,...) arbeiten.
Das hab ich schon öfter gehört, habs aber bei mir noch nicht erleben dürfen.
Man könnte ja auch den SafeHwnd des Dialogs/Edits übergeben...was Du wohl meinst.
-
Versuch es doch mal in der Dokumentation (MSDN Library) mit diesen beiden:
CWnd::m_hWnd
CWnd::GetSafeHwnd()
-
xthing schrieb:
Hi, danke für den Hinweis. Kannst Du mir das etwas genauer schildern. Wie bekomme ich den hwnd des Editfeldes und mit welchen Parametern muss ich ::SendMessage aufrufen.
Vielen Dank noch mal.
Grüsse
xthingaus dem Dialog heraus, z.B. beim erstellen des Threads:
// der Konstruktor muss ein HWND annehmen und sich den speichern. CMyThread thread( editfeld.GetSafeHwnd()); //editfeld mit Deinem Edit ersetzenaus dem Thread heraus:
TCHAR szText[] = _T( "Text" ); ::SendMessage( hWndEdit, WM_SETTEXT, (WPARAM)0, (LPARAM) szText ); //hWndEdit ist das übergebene HWND beim Konstruktor
-
Danke, aber muss ich ein UpdateData(false) aufrufen, damit der Text angezeigt wird? Wenn ja, gibt das die Fehlermeldung: Debug Assertion failed!! bzw. Es wurde versucht, einen nicht unterstützten Vorgand auszuführen.
Kannst du mir dan noch mal nen Tipp geben.
Danke noch mal
Grüsse
xthing
-
Ok Du hast wahrscheinlich Deinem Edit-Feld einen CString zugeordnet...
dann mach es so:CWnd* pWnd = GetDlgItem( IDC_DEIN_EDIT ); // IDC_DEIN_EDIT mit der ID Deines Edits ersetzen CMyThread thread( pWnd->GetSafeHwnd());aus dem Thread heraus:
TCHAR szText[] = _T( "Text" ); ::SendMessage( hWndEdit, WM_SETTEXT, (WPARAM)0, (LPARAM) szText );UpdateData(FALSE) brauchst Du nicht, um den Text _anzuzeigen_, da Du hier direkt über das Edit als Control gehst und nicht über eine Variable...