Timer in einem Thread



  • Wofür rufst du SetTimer auf?

    UINT CtestappDlg::StartTimer(LPVOID lpParam)
    {
        CtestappDlg* pDlg   = (CtestappDlg*)lpParam;
        static DWORD dwTime = ::GetTickCount();
        CString strTime;
    
        while (true)
        {
            if ((::GetTickCount() - dwTime) > 1000)
            {
                dwTime = ::GetTickCount();
                 .
                 .
                // DAS IST ANSTELLE VON SETTIMER! HIER MUSS DAS GEMACHT WERDEN WAS DER TIMER MACHEN SOLL!
            }
    
            strTime.Format(_T("%02d:%02d:%02d"), pDlg->GetHours(), pDlg->GetMinutes(), pDlg->GetSeconds());
            pDlg->GetDlgItem(ID_DEINES_EDITFELDES)->SetWindowText(strTime);
        }
    
        return 0;
    }
    

    Wie Lautet die Fehlermeldung? Hast du beim starten des Threads als Parameter this als LPVOID gecastet angegeben? Hast du die Getter und Setter richtig implementiert?



  • Genau in der Zeile

    pDlg->GetDlgItem(IDC_Timer)->SetWindowText(strTime);
    

    bekomm ich die Meldung:

    "Debug Assertion Failed!" Genaueres steht nicht da.

    Ich rufe den Thread folgendermaßen auf:

    m_pThread = AfxBeginThread(StartTimer,&call, THREAD_PRIORITY_LOWEST)
    

    wobei m_pThread ein Pointer von CWinThread ist.

    Ich hoffe, dass die Getter- und Settermethoden richtig implementiert sind.
    Hier z.B. die Getter- Settermethoden für die Sekunden:

    int CtestappDlg::GetSeconds()
    {
    	return  m_seconds;
    }
    
    void CtestappDlg::SetSeconds(int seconds)
    {
    	m_seconds = seconds;
    }
    


  • Getter und Setter sind richtig. Von welchem Type ist die variable call?



  • testappDlgCall call;
    

    testappDlgCall ist eine Struktur, die außerhalb der Klasse definiert wurde:

    struct testappDlgCall {
       CtestappDlg *pDoc;
       HWND hWnd;
    };
    


  • Ne, es gibt eigentlich nur noch ein Problem und das ist folgende Codezeile:

    pDlg->GetDlgItem(ID_DEINES_EDITFELDES)->SetWindowText(strTime);
    

    Da bekomm ich eine Assertion...



  • m_pThread = AfxBeginThread(StartTimer, (LPVOID)*this, THREAD_PRIORITY_LOWEST)
    

    😉 Du kannst das HWND vom Dlg Pointer nehmen...

    Dann debugg mal...



  • Hm, vielen dank erstmal für die tolle Hilfe (D) Evil, aber mit UpdateData hab ich immernoch ziemliche Probleme. Sobald ich UpdateData in der StartTimer aufrufe, bekomm ich beim Debuggen in der Zeile

    CDataExchange dx(this, bSaveAndValidate);
    

    eine Debug-Assertion.

    Sry wenn ich langsam nerve, aber ich kriegs einfach net hin.



  • Wenn dann könntest de nur pDlg->UpdateData aufrufen... wobei ich net weiß ob die public ist, was das wiederrum nciht machbar amchen würde... aber UpdateData brauchst de eh net wenn de das mit setwindowtext usw machst...



  • Super, nach 3 Tagen tickt mein Timer endlich, vielen, vielen Dank (D)Evil, ohne dich hätt ichs net geschafft 😃
    Jetzt muss ich meinen Thread nur noch korrekt abwürgen und die Sache ist perfekt 🙂

    Mit freundlichen Grüßen

    enne



  • Ah, und weil es mir gerade einfällt, gibts eine Methode mit der man erfahren kann, ob ein Thread gerade läuft?



  • UpdateData kann man in einem Thread nicht aufrufen.

    Zu deiner Frage:
    GetExitCodeThread



  • Hi, ich hab jetzt noch ein kleines Problem. Irgendwie funktioniert das nicht ganz mit GetExitCodeThread. Ich lass meinen Thread nun in einer SDI-Anwendung laufen, welche von CFormView abgeleitet wurde. Jedoch gibts hier die Klasse CEvent nicht, was die Sache noch etwas erschwert. Ich habs mal so probiert:

    void CCNCProgrammView::OnClose()
    {
    
        m_bWantExit = true;
    	m_pThread->m_bAutoDelete = false;
    	::WaitForSingleObject(m_pThread->m_hThread, 2000);
    	::AfxEndThread(0, TRUE);	
    }
    

    Klappt aber auch nicht ganz, da mein Timer nach 2 Sekunden weiterläuft.


  • Administrator

    Darf ich fragen wieso es hier kein CEvent geben soll?

    #include <afxmt.h>
    

    Und du hast die CEvent-Klasse wieder.

    Oder habe ich was missverstanden?

    Grüssli



  • Ok, sry, du hattest recht, trotzdem hab ich immer noch das Problem, das ich nicht weiß, wie ich einen Thread mittels "Abbrechen" - Button zum Stillstand bringen kann.


Anmelden zum Antworten