Probleme mit WorkerThread
-
Hallo Jungs,
habe ein kleines Problem zu Lösen.
Ich habe einen Worker Thread soweit habe ich diese Funktion denke ich verstanden.
Problem bei mir ist. Ich übergebe das aktuelle Fenster von wo aus der Thread gestartet wurde. In Meinem Fall das MainFrm.Dieses habe ich gesplittet und möchte nun per getpane() das Handle vom Fenster holen auf das ich zeichnen möchte. Nur macht er mir da einen assert Fehler mit wincore.cpp
Nun mal zum Code.
void CMainFrame::OnBearbeitenVideobild() { if(m_cameraControl.m_nthreadStartStop == 0) { m_cameraControl.m_nthreadStartStop = 1; AfxBeginThread(CMainFrame::MyThreadProc,this); } else { m_cameraControl.m_nthreadStartStop = 0; } // TODO: Add your command handler code here } UINT CMainFrame::MyThreadProc( LPVOID pParam) { CMainFrame *mainApp = (CMainFrame*)pParam; CameraApp *camApp = (CameraApp*)&mainApp->m_cameraControl; CWnd *test = mainApp->m_wndSplitter.GetPane(0,0); //Hier steigt er aus. if (camApp == NULL || !camApp->IsKindOf(RUNTIME_CLASS(CDC))) return 1; // if pObject is not valid camApp->MultiPicture(test,&camApp->m_nthreadStartStop); return 0; // thread completed successfully }
Laut MSDN kann ich ja alles dem Thread übergeben wenn ich es denn richtig caste.
Was ich ja eigentlich tue.
Kann mir da jemand helfen ??
Gruß
-
CWnd Objekte sind threadafin. D.h. es gibt eine interne Map je Thread in dem die Handles und die Objekte verwaltet werden.
Solange nur auf das m_hWnd Objekt zugeriffen wird ist das noch in Ordnung. Aber sobald bestimmte MFC Wrapper verwendet werden kann diesnur aus dem Thread passieren in dem auch das Objelkt erzeugt wurde.
Ansonsten würde es extrem helfen, uns zu sagen welchen ASSERT Du bekommst.
Das Übergeben eines HWND Handles geht aber immer.
-
Hier ein Link hab ein Bild gemacht.
http://www0.xup.in/exec/ximg.php?fid=46434680Also nur das ich es richtig verstanden habe.
Dieses m_hWnd Objekt ist dann von meinem mainfrm das Objekt auf das ich zugreife.Und dieser MFC Wrapper ist dann mein splitter mit diesem getPane() ??
Hatte auch schon versucht den Cwnd oder auch pDC Pointer vom benötigten Fenster in der übergebenen Klasse zu speichern nur konnte ich dann nicht den pDC vom CWnd holen oder per pDC nichts zeichnen.
-
Übergib deinem Thread ein Handle zu deinem Fenster. Wenn deine GUI dann irgendwas machen soll ... aktualisieren, irgendwas anzeigen, oä, schickst du mittels SendMessage (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx) eine Nachricht an dein Fenster.
Dann musst du zwar noch einen MesssageHandler für diese Nachricht in deinem GUI-Fenster anlegen (https://msdn.microsoft.com/de-de/library/6d1asasd%28v=vs.71%29.aspx), aber dann solltest du keine Probleme mehr mit MFC und Threads haben, wenn ich das jetzt noch so richtig in Erinnerung habe.
-
Mit dem Handle alleine geht es nun musste nur extra aktualisieren. Was ich ohne Thread nicht musste deswegen hat es nicht funktioniert.
Vielen Dank für die Tolle Hilfe hier