Timer



  • Hi Leutz!

    Da will ich in einer ListBox Zahlen raufzählen und damit das nicht so schnell geht mit einen Timer verzögern Dazu habe ich diesen Code:

    m_Zahl = 0;
    
    	while (m_Stop)
    	{
    		SetTimer(nIDEvent, 1000, NULL);
    		m_Zahl = m_Zahl + 1;
    		KillTimer(nIDEvent);
    		m_ZahlString.Format("%s", m_Zahl);
    		m_Ausgabe.AddString(m_ZahlString);
    	}
    

    Weder verstehe ich den Timer mal so ganz, noch funzt es hier!

    Wer kann den Code so umstellen, daß er auf klapt?

    THX Markus 👍



  • Du musst statt Timer, die Funktion Sleep() benutzen. Sie macht eine Pause die du ihr als Parameter in ms eingibst.

    Timer benutzen kannst du aber so:

    Du musst die Fnkt OnTimer hinzufügen, mit dem ClassWizard. in diese packst du dein Code, und um den Timer zu starten rufst du die Fkt SetTimer(0, 1000, NULL); auf...



  • Der Timer (WM_TIMER) ist eine Windowsnachricht. Er wird in einer eigenen Methode abgearbeitet.

    1.)Lege ein Ressoursensymbol an. Menü->View->Ressoursensymbole->Neu-> zB.: Name=IDT_UPDATE Wert=501
    Mußt du nicht so machen ist aber übersichtlicher da du siest welche Nummern bereits vergeben sind.

    2.)global für die Klasse die Variablen

    int m_Zahl
    bool m_Stop
    

    anlegen.

    3.)Wir sind jetzt in deinem Code und wollen den Timer starten.

    m_Zahl = 0;
    m_Stop = false;
    SetTimer(IDT_UPDATE,1000,NULL);//Timer starten mit 1000ms
    

    4.) Füge die Windowsnachricht WM_TIMER hinzu. Sollte die Funktion

    void MyProgramm::OnTimer(UINT nIDEvent)
    {
    }
    

    bringen.

    5.)In der in Punkt 4 erstellten Windowsnachrichten-Methode WM_TIMER

    void MyProgramm::OnTimer(UINT nIDEvent) 
    {
    	// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
    
    	if(nIDEvent == IDT_UPDATE)//Abfragen welcher Timer gerade läuft, denn es könnten mehrere sein
    	{
    		if(!m_Stop)
    		{
    			m_Zahl++;                       //Das selbe wie   m_Zahl = m_Zahl + 1;
    			                                //Die Nummernliste fängt jetzt bei 1 an
    			CString str;
    			str.Format("%s", m_Zahl);
    			m_Ausgabe.AddString(str);
    			//soll die Liste mit 0 anfangen dann schreib statt oben hier m_Zahl++;
    		}
    		else
    		{
    			KillTimer(IDT_UPDATE); 
    			//Vielleicht stellst du hier m_Stop wieder auf false und m_Zahl auf 0      nur wenn nötig
    		}
    	}
    
    	CEditView::OnTimer(nIDEvent);
    }
    

    Zum Beenden der Liste mußt du nur mehr die Variable m_Stop auf true setzen!

    Hoff es geht!
    MFG, BigSigi



  • cplusplus war wohl schneller als ich 😃

    Das mit Sleep stimmt schon, aber dann kann er das raufzählen nicht beeinflussen. Solange es hochzählt hängt er in der Schleife und kann inzwischen nichts machen.

    Da er aber die Variable m_Stop im Code hat, möchte er sicherlich Irgendwie (vermudlich mit Taste) endscheiden wie hoch der Wert in der Liste werden soll.

    Bye, BigSigi



  • BigSigi schrieb:

    Das mit Sleep stimmt schon, aber dann kann er das raufzählen nicht beeinflussen. Solange es hochzählt hängt er in der Schleife und kann inzwischen nichts machen.

    Wenn er das aber in einem separatem Thread macht, dann schon 😉



  • was iss mit OnTimer ??????



  • Hast ja recht Cplusplus. Aber wenn er schon mit Timern probleme hat dann werden wir doch nicht mit Threads anfangen 😉 .
    Wollt am anfang auch auf Sleep hinweisen, hab´s mir dann aber anders überlegt 😃

    Klara, was meinst du mit WAS IS MIT ONTIMER?
    Hab ihm eh ein kleines Beispiel mit der Timerfunktion aufgeschrieben. 🤡

    MFG, BigSigi


Anmelden zum Antworten