Frage MDI, Timer und Thread



  • Hey,

    ich habe hier eine MDI-Anwendung und in meiner Doc-Klasse erhalte ich ca. 2mal pro Sekunde eine Message von meinem Thread, der mir mitteilt, dass neue Daten da sind.
    Wenn ich diese Message empfange habe, schreibe ich gleich per AddTail ans Ende einer CList, die somit die ganzen empfangenen Daten enthalten soll.
    Das funktioniert auch so wie es soll.

    Im View meiner Anwendung prüfe ich in OnTimer alle 500ms, ob etwas in der Liste steht, wenn ja, rufe ich von dort aus ne andere Funktion auf, mir der ich mir die Daten daraus hole:

    CSingleLock singLock(&m_mut);
    	if (singLock.Lock(0))
    	{
    		if (!m_pDoc->list.IsEmpty())		// wenn Liste noch nicht leer ist...
    		{
    			lpWeatCopy = m_pDoc->list.GetAt(m_pDoc->list.GetHeadPosition());
    			singLock.Unlock();
    			FillListCtrl(lpWeatCopy);
    			m_pDoc->list.RemoveHead();		// bearbeiteten Eintrag an 1. Stelle in Liste entfernen
    		}
    	}
    	if (singLock.IsLocked())
    		singLock.Unlock();
    

    In FillListCtrl schreibe ich die Daten in mein ListCtrl und am Ende dieser Funktion auch noch in ein Logfile.

    Per Klick auf Stop wird der Thread und der Timer beendet und noch geprüft, ob noch etwas in der Liste steht, wenn ja verarbeite ich das noch.

    Meine Fragen:
    Wie kann ich am besten meinen Timer beenden, er soll aber seinen Durchlauf erst beenden bevor ich ihn dann kille !
    Wie könnte man das umsetzen, dass ich im Stop-Button-Handler erst weiterarbeite, wenn der Timer gekillt ist ??

    Wenn mir noch mehr einfällt, melde ich mich schon. 🙂

    Vllt kann mir da jemand helfen...



  • Hmm... weiß nicht ob ich es richtig verstanden habe, aber vielleicht würde es Helfen den im Timer ausgeführten Code in eine Funktion zu packen, d.h. im Timer ist nur ein Funktionsaufruf..
    Im Button Handle kannt Du den Timer Killen und anschließend die Funktion 1x aufrufen.. ??

    Gruß
    Marcus



  • Also erstmal danke für deine Antwort !!

    Habe das jetzt auch so, dass im Timer-Event nur der Funktionsaufruf ist.

    Habe es folgendermaßen bis jetzt:
    -Bevor die Funktion in OnTimer aufgerufen wird, wird geprüft, ob eine bestimmte bool-Variable gesetzt ist, wenn ja mach ich ein SetEvent(m_TimerCloseEvent), dass ich in OnInitialUpdate created und auf nonsignaled gesetzt habe

    -ich setzte im Stop-Button-Handler die bool auf true, dann "sieht" der Timer das und setzt das Event, vorher hab ich noch den Thread beendet

    -im Button-Handler warte ich mit WaitForSingleObject darauf, wenn ich innerhalb des Timeouts bin, gehe ich einfach weiter und mache noch den Rest, wenn Timeout abgelaufen ist, dann kille ich einfach den Timer und mache dann normal weiter

    -wenn wieder auf Start geklickt wird, dann setze ich mein Event mit ResetEvent(m_hTimerCloseEvent) wieder auf nonsignaled

    So funktioniert das bis jetzt, kann es erst wieder am Montag probieren, dann werde ich es sehen 👍

    Die Hauptsache ist eigentlich, dass mir keine Daten verloren gehen.
    Ich hoffe, dass meine Vorgehensweise zum korrekten Beenden führt.

    EDIT:
    der Code von oben sieht jetzt noch etwas anders und "sinnvoller" aus:

    CSingleLock singLock(&m_mut);
    if (singLock.Lock(0))
    {
        if (!m_pDoc->list.IsEmpty())        // wenn Liste noch nicht leer ist...
        {
            WeatCopy = m_pDoc->list.RemoveHead();
            singLock.Unlock();
            FillListCtrl(WeatCopy);
        }
    }
    if (singLock.IsLocked())
        singLock.Unlock();
    

Anmelden zum Antworten