Thread und UpdateData(FALSE/TRUE)
-
Hallo zusammen,
ich benutze WinXP Prof und MS Visual C++ 6.0
Folgendes Problem:
ich weiß dass die Fkt UpdateData(...) nicht in einem Thread läuft.Da ich in meinem Thread eine Serielle Verbindung aufbaue und gewisse daten auslese, muss ich kontrollieren, ob richige Daten empfangen worden sind.
Falls ja, möchte ich gerne einen Eintrag in EditBoxen vornehmen-aber das geht ja nicht aus einem Thread.Also beim starten eines Dialog in der OnInitDialog()
wird der Thread aufgerufen:AfxBeginThread(SeriellThread,this);
Dann die Thread Funktion:
UINT CGeraetZustand::SeriellThread(LPVOID pParam) { CSerialComm comm; comm.PortOpen("Com1", 9600); ... ... ... return 0; }
Wie kann ich jetzt z.b. der Funktion OnInitDialog() bescheid geben, dass die Einträge gemacht werden sollen?
Vielen Dank
MfG Dippi
-
Rufe doch aus dem Thread eine Funktion des Dialoges auf.
// hier übergibst du ja bereits den this-Pointer des aktuellen Dialoges AfxBeginThread(SeriellThread,this);
UINT CGeraetZustand::SeriellThread(LPVOID pParam) { // cast auf dein dialog (evt. noch schön auf null prüfen etc. MyDlg* pDlg = (MyDlg*) pParam; // jetzt dein funktion aufrufen, pDlg->ProcessFunction() return 0; }
'ProcessFunction()' gehört zu deinem Dialog, wird aber durch den Thread aufgerufen.
Hope that helps!
-
Die einfachste Lösung ist: Schicke Dir vom Thread aus eine Nachricht (WM_USER+x) an den UI-Thread (bzw. das Fenster). Dort kannst DU darauf reagieren und bist somit im korrekten Thread und kannst dann die Dinge tun, die Du willst.
-
http://www.codersource.net/mfc_user_interface_thread.html
Hier findest du ein Beispiel zu GUI-Threads und WM_USER+x - Nachrichten, was Jochen angesprochen hat.
-
Abgesehen davon bringt es nichts OnInitDialog aus einem Thread aufzurufen.
OnInitDialog wird vom DLG aufgerufen wenn der Dialog erstellt wird bzw. schon da ist.
Du muss also vorher den Dialog erstellen und dann kann der Thread auf Steuerelemente zugreifen.