Zugriff auf Steuerelemnte einer Klasse bei einem Thread?



  • Hallo Leute,
    bin absoluter Anfänger im Bereich MFC.

    Ich habe folgende Frage zu einem von mir erstellten Thread.
    Hier der Auszug:

    UINT ThreadProc(LPVOID param)
    {         
    // Anmerkung:eigene klasse //die eine CSV Datei zerlegt
    CParser m_cparser;
    //...
    
    CString text;	
    int iterator=0;
    for(;iterator < m_parser.GetLinesCount();iterator++)
    	{
        _sleep(100);
    	text.Format("%d",iterator);
    
    //cast void zu Cwnd + übergebe des aktuellen iterators
    ((CWnd*) param)->GetDlgItem(IDC_EDIT_FORTSCHRITT)->SetWindowText(text);
    
    if(iterator%100==0)
    ((CWnd*) param)->GetDlgItem(IDD_DIALOG_STATUSANZEIGE)->UpdateWindow();
    
    //...
    
    return 0;
    
    	}
    

    So jetzt zu meiner Frage:

    Da die Funktion ThreadProc global liegt, kann ich nicht auf die member der Dialogfunktion zugreifen, außer über GetDlgItem.
    Wie kriege ich es hin die nicht von CWnd abgeleitete Member
    die in der Dialogklasse CStatusanzeigeDlg liegen im Thread anzusprechen?

    Ich hoffe, habe bei diesem Post etwas mehr Glück als beim letzten Mal 😞

    Dominik



  • Als Threadparameter den this-Zeiger der Dialogklasse übergeben und ihn in der ThreadProc wieder auf einen Zeiger der Dialogklasse casten und dann
    Zeiger->GetDlgItem machen ...



  • das wird ihm wenig nutzen.
    Selbst wenn er noch ein Cast macht kommt er bsp. an einige KlassenMember
    nicht dran.
    Wie soll das z.Bsp. mit einer instanz eines CStrings funktionieren?

    Ich denke, für solche Fälle müßte schon die Meyers Singleton Klasse eingesetzt werden.

    Korrigiert mich aber, wenn ich falsch liege.

    epidemic



  • Was du machst ist ein Workerthread.
    Es gibt auch einen "Benutzeroberflächenthread".

    Einfach eine Klasse von CWinThread ableiten. Dieser dann den this des Dialogs übergeben und das wars



  • In dem genialen Tutorial von Dr. Erhard Henkes
    steht es detalliert und wie IMMER verständlich beschrieben.

    Habe selber einige Beispiele getestet.

    epidemic


Anmelden zum Antworten