User thread oder worker thread?



  • Hallo,

    in meinem Programm habe ich einen Dialog der mir einen Messwert anzeigt.
    Dieser Messwert erhalte ich ca. alle 3 Sekunden von einem Messgerät und muss ihn dann in meinem Dialog aktualisieren.
    Mein Problem ist, dass ich während des Kommunikationsvorganges zwischen PC und Messgerät den Dialog weder verschieben, noch beenden kann. Habe es mit einem Timer versucht doch die Performance ist alles andere als gut.
    Nun muss ich wohl doch einen 2. thread starten.

    Meine Frage: was für einen thread soll ich nun erzeugen? Einen worker thread in dem ich die Kommunikation durchführe und die Werte im Dialog aktualisiere oder einen user thread, in dem ich auf ereignisse, wie zB das schließen des Dialoges warte?



  • Habe mich für worker thread entschieden.



  • Ich starte einen worker thread mit einer Thread-Funktion

    UINT MyThreadFunc(LPVOID pParam)
    
    Zeiger=&IrgendWelcheDaten;
    CWinThread* pMeinFaden=AfxBeginThread(MeineFadenFunktion,Zeiger);
    

    Wozu ist in diesem Code Zeiger verantwortlich?

    Kann ich aus der Thread-Funktion eine Methode aufrufen? Wird die aufgerufene Methode dann in diesem Thread ausgeführt?

    UINT MyThreadFunc(LPVOID pParam)
    {
       MyFunc();
    }
    


  • Der Zeiger ist dein pParam. Das gibst du der Funktion mit, die den Thread startet.



  • Jo, damit du keine bösen globalen Variablen verwenden musst.
    Sonst kann der Worker-Thread ja nicht wissen was genau er tun soll, bzw. an welchen Dialog er Update-Nachrichten schicken soll etc.



  • Beim Versuch den Thread zu starten bekomme ich nun folgende Fehlermeldung:

    AfxBeginThread: Durch keine der 2 Überladungen kann Parameter 1 vom Typ  'UINT(LPVOID) konvertiert werden'
    

    Hier mein Code:

    UINT CSipromTApp::MyDisplayThread(LPVOID pParam)
    {
    	CSipromTDoc* pDoc = (CSipromTDoc*)(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
    	ASSERT(pDoc);
    
    	if(pDoc->GetDeviceType() == 1) 
    	{	
    		MyTH100Com->MeasurementCom();
    	}
    }
    
    void CSipromTApp::OnViewDisplay()
    {
    BOOL bCancel = FALSE;
    
    	/* creates the dialog */
    	MyDisplay=CDisplay::Instance(&bCancel, AfxGetMainWnd());		
    MyDisplay->InitialDialog();
    	MyDisplay->ShowWindow(false);	
    	MyDisplay->UpdateData(FALSE);
    
    	LPVOID* pThreadData = &bCancel;
    	CWinThread* pMyThread = AfxBeginThread(MyDisplayThread, pThreadData);
    

    Was mache ich denn alles falsch?



  • Ist deine Thread-Funktion eine normale Methode? Wenn ja, ist das Problem klar: AfxBeginThread erwartet einen Funktionszeiger (d.h. eine globale Funktion oder static-Methode), keinen Methodenzeiger).

    PS: Und ich würde dem Thread keine Adresse einer lokalen Variablen übergeben - die wird im schlimmsten Fall pulverisiert, lange bevor der Thread überhaupt zu Wort kommen kann.



  • Ja das ist eine normale Methode. Also als globale Methode als extern deklarieren? Oder static davor schreiben?



  • Okay, jetzt läufts.
    Doch wenn ich auf das Document zugreifen möchte, bekomme ich einen Fehler: unbehandelte Ausnahme: Lesezugriff

    UINT CSipromTApp::MyDisplayThread(LPVOID pParam)
    {
        CSipromTDoc* pDoc = (CSipromTDoc*)(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
        ASSERT(pDoc);
    
        if(pDoc->GetDeviceType() == 1) 
        {    
            MyTH100Com->MeasurementCom();
        }
    }
    

Anmelden zum Antworten