Thread
-
Hallo,
ich hab folgendes Problem.
Ich möchte gerne bei einer MDI-Anwendung, wenn bereits ein Window geoefnet ist, in der Threadfunktion in den Device Context zeichnen. Die Threadfunktion ist eine static Funktion der Documentenklasse. In der Threadfunktion verwende ich folgenden Code:1 UINT CMO4Doc::LiveThreadProc( LPVOID Param )
2 {3 CMO4App* pApp = (CNMO4App*) AfxGetApp();
4 CFrameWnd* pChild = ((CMDIFrameWnd*) 5(pApp->m_pMainWnd))->GetActiveFrame();
6 CMO4View* pView = (CMO4View*) pChild->GetActiveView();
7 CDC c = pView->GetDC( );
8 CMO4Doc pDoc = pView->GetDocument();
9}Dabei stürzt das Program in der Zeile 4 ab.
Wenn ich in der Funktion in den ich den Thread aufrufe die Zeile 3 und 4 hinzufüge, das heißt das ChildFenster erzeuge und der Threadfunktion als Parameter übergebe, und in der Threadfunktion folgenden Code ausführe:
1 UINT CMO4Doc::LiveThreadProc( LPVOID Param )
2 {3 CFrameWnd* pChild = (CFrameWnd*)Param;
4 CMO4View* pView = (CMO4View*) pChild->GetActiveView();
5 CDC c = pView->GetDC( );
6 CMO4Doc pDoc = pView->GetDocument();
7 pView->OnDraw(c);
8}Kann ich erreichen, daß in die OnDrawMethode gesprungen wird. Allerdings stürzt das Programm innerhalb der Funktion dann ab.
Ich glaube das liegt an dem DC den ich an die OnDraw Merhode übergebe.Dieser wird glaube ich nicht mit dem richtigen Window assoziert.Wie kann ich einen korrekten DC in der Threadfunktion auf das geladene Window bekommen.
-
Das Problem ist IMHO, das AfxGetApp nur funtioniert wenn der aufrufende Thread auch die App ist. Versuch doch mal über pParam den Document-Zeiger zu übergeben.
-
Du kannst keine CWNd Objekte in einem anderen Thread verwenden.
Das Problem ist das je Thread eine Map geführt wird, in der die Window Handles Deinem CWnd Objekt zugeordnet werden. Das ist erstmal kein Problem, aber es aber gibt einen Haufen von Funktionen in CWnd die vor der Ausführung prüfen, ob das Handle auch in der Map ist.
Rufst Du also diese Funktion aus einem Thread auf, der das Fenster nicht erzeugt hat, fliegt Dir die Funktion mit einem ASSERT um die Ohren.Weiterhin ist Dein Zugriff aus dem fremden Thread auf alle Deine Dokumente und Views gewagt. Bist Du sicher, dass die Daten auch threadsicher verwaltet sind?