Zugriff aus Thread auf Doc



  • Hallo zusammen,

    ich meinem Workerthread habe ich ein Objekt erstellt, welches Daten berechnet und dann in die Doc-Klasse der Hauptanwendung schreiben soll. Doch wenn ich mir den Zeiger auf das Document holen will, bekomme ich einen Fehler, mit dem ich nichts anfangen kann.

    Codeauszug:

    //Meine Thread-Funktion
    UINT CFolderSyncView::ScanThread(LPVOID pParam)
    {
    	CScanDialog* pScanDlg = static_cast<CScanDialog*>(pParam);
    	CFileScanner Scanner(pScanDlg);
    	Scanner.go();
    	return 0;
    }
    
    //Konstruktor von CFileScanner
    CFileScanner::CFileScanner(CScanDialog* pScanDlg)
    {
    	m_pScanDlg = pScanDlg;
    	m_pDoc = static_cast<CFolderSyncDoc*>(static_cast<CFolderSyncView*>(m_pScanDlg->GetParent())->GetDocument());
    // ==> Crash
    

    Als Fehler bekomme ich angezeigt:

    BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
    {
    	ENSURE(this != NULL);
    	// it better be in valid memory, at least for CObject size
    	ASSERT(AfxIsValidAddress(this, sizeof(CObject)));
    
    	// simple SI case
    	CRuntimeClass* pClassThis = GetRuntimeClass(); //Darauf zeigt er
    
    	ENSURE(pClassThis);
    	return pClassThis->IsDerivedFrom(pClass);
    }
    

    Was hat das Ganze nun zu bedeuten? Kann ich aus meinem Thread nicht auf das Document zugreifen? Der Zugriff auf den Dialog funktioniert...



  • Das ist wohl kaum der Fehler 😉

    Aber was hälst du von:

    (CFolderSyncDoc*((CMainFrame*)AfxGetMainWnd())->GetActiveView())->GetDocument()
    

    ?! 😃



  • (D)Evil schrieb:

    Das ist wohl kaum der Fehler 😉

    Was meinst du damit? 😕

    Dein Vorschlag hat leider auch nicht funktioniert, ich glaube man kann nur aus dem Hauptthread AfxGetApp() oder AfxGetMainWnd() aufrufen.

    Ich hab jetzt einfach einen Zeiger auf das Document in m_pScanDlg gespeichert, mit dem klappt der Zugriff auf das Document. 🙂

    Allerdings bin ich mir jetzt nicht ganz sicher: Darf ich das so machen? Oder kann ich jetzt irgendwie Zugriffsverletztungen o.ä. auslösen?

    Gruß Brainiac


  • Mod

    Selbst wen Du einen View als Parent angibst, das eigentliche Parent wird immer ein entsprechendes Frame Window und niemals ein Fenster mit einem WS_CHILD Stil!

    Wenn Du schon einen Dialog hast, dann kannst Du doch dem Dialog den entsprechenden Zeiger auf das Dokument mitgeben und eben mit AfxGetMainWnd ermitteln, wie (D)Evil es vorschlug.
    Warum muss Dein Thread wissen wie er an ein Dokument kommt? Warum muss Dein Thread auch noch wissen das es da ein Frame Window und einen View gibt? Übergib direkt den Zeiger.

    AfxGetApp darf übrigens immer aufgerufen werden, aus jedem Thread. Mit AfxGetMainWnd hast Du recht, dass kann (muss aber nicht) auf ein Fenster des eigenen Workerthreads verweisen.



  • Martin Richter schrieb:

    Wenn Du schon einen Dialog hast, dann kannst Du doch dem Dialog den entsprechenden Zeiger auf das Dokument mitgeben und eben mit AfxGetMainWnd ermitteln, wie (D)Evil es vorschlug.
    Warum muss Dein Thread wissen wie er an ein Dokument kommt? Warum muss Dein Thread auch noch wissen das es da ein Frame Window und einen View gibt? Übergib direkt den Zeiger.

    So hab ichs ja nun gemacht, und es funktioniert. Ich war mir nur nicht sicher, ob man das darf und ob das sicher ist, wenn es schon nicht klappt, dass der Thread sich selbst einen Zeiger auf das Document holt.

    Aber aus deiner Antwort entnehme ich, dass das eine legale Methode ist. 😃 Danke für die Antworten!

    Gruß Brainiac


  • Mod

    Ich sehe es vom OOP Design sogar als die einzig richtige Methode an.
    Warum solltest Du Objekte bemühen, die Du zur Lösung des Problems gar nicht brauchst!


Anmelden zum Antworten