In Thread Funktion aus anderer Klasse aufrufen



  • hallo,

    ich starte den thread in der klasse CWiwoDlg wie folgt:

    AfxBeginThread(ExecuteThread, pWiwoDlg, 0, THREAD_PRIORITY_NORMAL, 0, 0);
    

    die methode ExecuteThread ist global und ruft variablen aus den klassen CWiwoDlg, sowie CGraph auf. wenn ich sie statisch deklariere erhalte ich fehlermeldungen. global sind die fehlermeldungen weg, doch sobald ich das programm durchdebugge und in die methode ExecuteThread() hineinspringe kommt eine fehlermeldung unabhängig vom code in der ersten befehlszeile: Zugriffsverletzung! wie kann ich also in einem thread eine funktion aus einer anderen klasse aufrufen???

    UINT ExecuteThread(LPVOID pParam)
    {
    	while(((CWiwoDlg*)AfxGetMainWnd())->m_bThreadFlag)
        {
    		if(((CWiwoDlg*)AfxGetMainWnd())->DSync)
    		{	
    			((CWiwoDlg*)AfxGetMainWnd())->DSync = false;
    
    			if(((CWiwoDlg*)AfxGetMainWnd())->pDP.x1 != 0)
    			{
    				((CWiwoDlg*)AfxGetMainWnd())->m_pGraph->DataTransfer();
    				Sleep(0);			// Setzt Thread auf ready!
    			}
    		}
        }
    	return 0;
    }
    

    mfg cappaja



  • habe das problem im ansatz gelöst. Ich habe die Threadfunktion in die Klasse CWiwoDlg gepackt und als static deklariert, anschließend caste ich pParam auf den klassenzeiger. so kann ich nun die parameter und funktionen ansprechen ohne einen fehler während der laufzeit zu erzeugen. jedoch läuft er jetzt zwar in die methode DataTransfer(), aber auch dort habe ich jetzt dasselbe problem wie zuvor, sodass ich diesen cast wohl auch dort überall anwenden muss? so müsste ich an jede Funktion den pParam an alle funktionen weiterleiten und dort dasselbe spielchen treiben. das sind viele methoden ineinander verschachtelt und der aufwand wäre riesig, hat wirklich niemand eine andere lösung parat?

    AfxBeginThread(ExecuteThread, this, 0, THREAD_PRIORITY_NORMAL, 0, 0);
    
    UINT CWiwoDlg::ExecuteThread(LPVOID pParam)
    {
    	CWiwoDlg *pWiwoDlg = reinterpret_cast<CWiwoDlg*>(pParam);
    
    	// Zeichnet die Daten in das Display
    	while(pWiwoDlg->m_bThreadFlag)
        {
    		if(pWiwoDlg->DSync)
    		{	
    			pWiwoDlg->DSync = false;
    
    			if(pWiwoDlg->pDP.x1 != 0)
    			{
    				pWiwoDlg->m_pGraph->DataTransfer(pParam);
    				Sleep(0);			// Setzt Thread auf ready!
    			}
    		}
        }
    	return 0;
    }
    


  • Warum übergibst du nicht über den pParam einen Zeiger auf deine CWiwoDlg-Instanz? Da fällt schon mal das ganze wilde gecaste weg. Welche Fehlermeldungen kommen da?



  • habe ich anfangs ja, aber dann kommt für alle aufrufe der fehler: error C2227: Der linke Teil von '->m_pGraph' muss auf Klasse/Struktur/Union zeigen

    hatte einen Zeiger CWiwoDlg* pWiwoDlg und den habe ich anstelle von "this" in die AfxGetMainWnd() übergeben. ich denke so meintest du es oder? aber da kam die oben genannte fehlermeldung.
    ich bekomme nur die fehlermeldung access violation.

    gruß cappaja



  • Greifst du von deinem Thread auf irgendwelche Gui-Controls zu? Das darfst du nicht machen.



  • Cappaja schrieb:

    habe ich anfangs ja, aber dann kommt für alle aufrufe der fehler: error C2227: Der linke Teil von '->m_pGraph' muss auf Klasse/Struktur/Union zeigen

    hatte einen Zeiger CWiwoDlg* pWiwoDlg und den habe ich anstelle von "this" in die AfxGetMainWnd() übergeben. ich denke so meintest du es oder? aber da kam die oben genannte fehlermeldung.
    ich bekomme nur die fehlermeldung access violation.

    gruß cappaja

    Ja klar musst du die Threadfunktion als staic in deinem Dialog definieren. Dann übergibst du beim Aufruf von AfxBeginThread den this-Zeiger und castest in der Threadfunktion einmaml so wie du es unten (dein 2. Eintrag) gemacht hast.
    Dann sollte es gehen.....
    Naja auf Controls nicht zugreifen sollte klar sein, aber ich denke das ist nicht dein Problem.
    Alternativ kannste ja beim Error C2227 (siehe oben) mal in den Debugger schauen, worauf der Zeiger gerade zeigt.



  • nein ich greife auf keine kontrollelemente zu. soweit funktioniert das alles jetzt auch. danke euch

    mfg cappaja


Anmelden zum Antworten