Timer starten, stoppen in Thread...



  • hi,

    ich hab einen timer, der soll in einem thread gestartet werden wenn etwas best. empfangen wird, und dann wieder gestoppt werden wenn was best. empfangen wird...
    in der OnInitDialog sag ich den Timer wann er immer wieder ausgelöst wird....

    läuft da der timer schon los? oder soll ich StartTimer verwenden...welche duration soll ich nehmen...weiss ja nicht wenn ich was empf. das der timer gestoppt wird!?

    ciao

    BOOL HauptdialogDlg::OnInitDialog()
    {
      CDialog::OnInitDialog();
      .........
      .........
    
      SetTimer(m_iTimerID, 1, 1000, 0);
    
      return TRUE;
    }
    
    void HauptdialogDlg::OnTimer(UINT nIDEvent)
    {
      ........
      ........
    
      CDialog::OnTimer(nIDEvent);
    }
    


  • Ja, der Timer läuft da schon los.

    Deinen letzten Satz verstehe ich nicht?
    Du weisst nicht wenn du was empfängst das der timer gestoppt wird?
    😉



  • wenn ich den timer im thread starte bekomm ich einen error:

    SetTimer(m_iTimerID, 1000, 0);
    error C2660: 'SetTimer' : function does not take 3 arguments
    

    aber wenn ich den Timer in der OnInitDialog starte dann gibt es keinen error...m_iTimerID ist ja global...hm

    cu



  • ist so ein error nicht eigenartig....das er in der OnInitDialog da nichts sagt?

    cu



  • ist so ein error nicht eigenartig....das er in der OnInitDialog da nichts sagt?

    Nicht wirklich. In deien OnInitDialog() funktionen verwendest du die überladene funktion CWnd::SetTimer() und die nimmt 3 parameter.
    Du rufst aber die globale WinAPI-funktion SetTimer() auf und die nimmt 4 parameter.
    aus MSDN

    UINT_PTR SetTimer( HWND hWnd,UINT_PTR nIDEvent,UINT uElapse,TIMERPROC lpTimerFunc );
    

    Kurt
    EDIT: Kopierfehler



  • danke...

    warum braucht der timer ein hwnd?

    gobal:
    HWND h_Hauptdialog;
    
    in der OnInitDialog mach ich:
    h_HauptdialogDlg = GetSafeHwnd();
    
    im thread starte ich den timer:
    SetTimer(h_HauptdialogDlg, m_iTimerID, 1000, OnTimer);
    was mach ich mit dem rückgabewert von SetTimer, läuft der Timer nun alle 1sec?
    
    void Client_HauptdialogDlg::OnTimer(UINT nIDEvent)
    { 
       CDialog::OnTimer(nIDEvent);
       .......
       .......
    }
    

    thx



  • hi,
    wie kann ich in der OnTimer(UINT nIDEvent) mehrere timer abfangen? das mit den else if klappt nicht recht;-(

    void Client_HauptdialogDlg::OnTimer(UINT nIDEvent)
    {
    
    if(nIDEvent == m_iTimerID_timeout)
    {
    }
    
    else if(nIDEvent == m_iTimerID_send)
    {
    }
    
    else if(nIDEvent == m_iTimerID_recv)
    {
    }
    
    }
    


  • Wo hast du denn die IDs definiert? Bei mir funktioniert solch eine Abfrage mit den ifs.

    Mach das lieber unter dem Punkt 'Resource Symbols'. Du gelangst dorthin, wenn du die rechte Maustaste im 'Resource View' drückst und dann 'Resource Symbols' auswählst.

    Gruss.



  • manfred. schrieb:

    warum braucht der timer ein hwnd?

    Vermutlich, damit feststeht, welches Fenster (Klasse) die Timer-Nachricht behandelt.



  • also ich hab die ids gobal definiert:
    UINT m_iTimerID_send;
    UINT m_iTimerID_recv;
    UINT m_iTimerID_timeout;

    machst du das mit if und else if oder nur mit if?

    bye



  • Also ich hatte die Abfrage genau wie du mit if und else if gemacht.
    Das Selbstfestlegen der UINT-Werte deiner Timer macht wahrscheinlich Probleme. Vielleicht sind diese identisch mit welchen aus der ID-Resource-Symbolen-Liste.

    Versuch mal, den Timern eine ID zu geben, so, wie ich das vorher schon beschrieben habe.
    🙂


Anmelden zum Antworten