Thread aus der Dialogklasse rauslösen
-
Du könntes der Threadklasse eine Zeiger auf deinen DIalog mitgeben und somit vom Thread auf den Dialog zugreifen.
Wie das gemacht wird habe ich schon mal in der FAQ geschriebene.
-
Ich bekomme das irgendwie nicht gebacken. Ich zeige mal, wie es bei mir erstmal funktioniert:
void CEncode_StaticDlg::OnBnClickedStart() { // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. infiles = new CString[numfiles]; LPTSTR file = new TCHAR[m_strFileOpen.GetLength()+1]; _tcscpy(file, m_strFileOpen); infiles[0] = file; if(m_strFileOpen == "") { CString m_strMeldung = "Keine Datei geladen"; MessageBox(m_strMeldung); } else { prozess=FALSE; qsetting=(((float)m_slider1.GetPos())/1000); zahl=0; OnProgressUpdate(NULL,NULL); if(bEncode) return; bEncode = TRUE; CWinThread *pThread = AfxBeginThread(EncodeThread,GetSafeHwnd(),THREAD_PRIORITY_NORMAL); UpdateWindow(); if(bEncode==1) { m_end="Ich arbeite!!"; UpdateData(FALSE); } } }
so, da ist der Aufruf für den Thread!
Der Thread selber steht also nun auch in der Dialogklasse:UINT CEncode_StaticDlg::EncodeThread(LPVOID pParam) { ..... ..... zahl++; ::PostMessage((HWND)pParam,WM_PROGRESS,0,0); ...... ..... } bEncode = FALSE; ::PostMessage((HWND)pParam,WM_ENDTHREAD,0,0); return 0; }
Und so funktioniert das auch wunderbar. Auch mit der Message an den Dialog ( muß ja auch
)
Aber das Ding richtig rauslösen, bekomme ich nicht hin.Bitte um ein paar Tips ( auch die ganze Header-Geschichte )
-
Was soll ich mit deinem Code anfangen. Geh in die FAQ auf Seite 2. Da steht es. Überschrift = CWinThread.
Du brauchst dann ur eine Klasse erstellen die von CWinThread abgeleitet ist.
-
Ok, ich werde es mal so probieren!
Danke
-
Jetzt läuft der Thread zwar fleißig los, aber wie kann ich nach der Berechnung eine Message an den Hauptdialog übergeben?
und dann habe ich noch das Problem, daß es mehrere Variablen gibt, die der Thread und der Hauptdialog verwenden sollen. Wenn ich die deklariere kommt halt immer eine Mehrfachdeklaration heraus.
Gruß
-
Jetzt habe ich das mit der Message auch verstanden.
Aber jetzt ist das Problem immer noch mit den gemeinsam benutzten Variablen.
Ich glaube, ich habe mich hier verrannt.
Bitte noch eine kleine Hilfe.
P.S. Wenn ich die Variablen static deklariere erstellt er mir zwar die Anwendung, aber sie funktioniert dann auch nicht!
-
So, jetzt funktioniert es! Aber leider nur mit dem Zusatz "/FORCE:MULTIPLE" beim Linker und alle mehrfach genutzten Variablen mit dem Schlüsselwort extern jeweils in der .cpp-Datei.
Gibt es da nicht eine generell elegantere Lösung, wenn verschiedene Klassen die gleichen Variablen benutzen müssen.
Ein kleiner Tip würde schon reichen.
Danke u. Gruß
-
Was du brauchst ist eine Sync zw. Thread und der Dialogklasse.
Wozu gibt es eine gemeins. Variable.Wenn du es so gemacht hast wie ich dir gesagt haben dann kannst du von Thread aus auf Variablen im Dialog zugreifen. Greifst du vom Dialog und von Thread auf eine Variable zu dann musst du sync.
-
Das heißt also, daß ich die Variablen im Dialog definiere und dann im Thread auf sie zugreife über die Member des Dialogs (also im Beispiel m_pOwner). Habe ich das so richtig verstanden.
Ich brauche die Variablen ja nur zur Berechnung.Sync. ist wahrscheinlich dann etwas schwieriger, Oder?
-
Sync heisst syncronisieren..
das bedeutet: Wenn du zum einen aus dem Thread und gleichzeitig aus dem Hauptdialog darauf zugreifst, du dich darüm kümmern musst das es nicht zu undefinierten zuständen kommt..
Sieh dir dazu zum Beispiel mal CCriticalSection an..
-
Synchronisieren ist mir schon klar. War ja nur so ne Frage. Ersteres ist viel wichtiger. Ist das nun so richtig?
-
Das heißt also, daß ich die Variablen im Dialog definiere und dann im Thread auf sie zugreife über die Member des Dialogs (also im Beispiel m_pOwner). Habe ich das so richtig verstanden.
hört sich richtig an
-
Hört sich nicht nur so an sonder ist richtig.
Sync braucht du nicht wenn nur der Thread darauf zugreift.
Genauso ist es bei einem Steuerelement.
Wenn du der Thread es ändert brauchst du auch keine sync.
Es gibt aber MFC-Klassen welche nicht Threadsicher sind. Schau dazu in der MSDN.
-
Hat bis jetzt alles super geklappt. Danke für die Hinweise!
Gruß