TimerQueue stoppen



  • Hallo

    Habe eine Queue in der Funktionen regelmässig aufgerufen werden. Nun würde ich gerne wenn ein Fehler in einer Funktion auftritt, dass keine Funktion mehr ausgeführt wird.

    Mit DeleteTimerQueueTimer kann ich die Funktionen aus der Queue löschen. Die Funktion muss aber korrekt beendet werden bevor sie gestoppt wird. Sprich ich übergebe DeleteTimerQueueTimer() INVALID_HANDLE_VALUE. Nun kann sich die Funktion nicht selber löschen sonst läuft sie in einen Deadlock.

    Nun muss ich ja irgendwie sagen können: Keine weiteren Zyklischen Updates mehr ausführen aber die aktuelle noch bis zu Ende ausführen.



  • Entweder habe ich immer zu schwierige Fragen oder es will keiner mit mir reden 😞


  • Mod

    Wahrscheinlich formulierst Du Deine Fragen so komisch das es keiner versteht... 😃

    Ich verstehe nicht was Du mit "Nun kann sich die Funktion nicht selber löschen sonst läuft sie in einen Deadlock!"

    Du hast mit diesem Aufruf gesagt. Die Funktion soll noch ausgeführt werden, danach wird Sie aus der Queue entfernt.
    Was ist nun Dein Problem?



  • Wahrscheinlich formulierst Du Deine Fragen so komisch das es keiner versteht... 😃

    Das könnte man ja dann auch sagen, kann ich ja nicht wissen.

    "Nun kann sich die Funktion nicht selber löschen sonst läuft sie in einen Deadlock!"

    Das steht ja so ähnlich in der MSDN:

    Furthermore, you cannot make a blocking deletion call on a timer associated with the callback.



  • Immer noch zu kompliziert. Was versteht ihr noch nicht?


  • Mod

    y-vonne schrieb:

    "Nun kann sich die Funktion nicht selber löschen sonst läuft sie in einen Deadlock!"

    Das steht ja so ähnlich in der MSDN:

    Furthermore, you cannot make a blocking deletion call on a timer associated with the callback.

    Dann gib doch einfach NULL an. Du darfst kein "blocking deletion" machen!

    Du bist in dem Timer Callback. Du sagst lösch das Ding nachdem es ausgeführt wurde und übergibst NULL. Du führst es gerade aus, also wird es gelöscht wenn Du die Funktion verlässt.
    Du kannst halt nicht darauf warten.



  • Das geht aber ich will ja folgendes erreichen:

    y-vonne schrieb:

    Keine weiteren Zyklischen Updates mehr ausführen aber die aktuelle noch bis zu Ende ausführen.

    Die Timerqueue führt die Funktion ja zyklisch aus. Nun passiert es dass bevor die erste zuerst ausgeführte Timerfunktionalität noch nicht beendet ist und die Funktion schon ein zweites mal ausgeführt wird. Nun wird diese 2te Ausführung sofort abgebrochen nachdem die erste beendet ist, und das führt zu einem Fehler

    Also jetzt muss ich doch die Timerqueue stoppen können, wenn ein Fehler aufgetretten ist.


  • Mod

    Dann setz Dir doch ein Flag in Deinem Datenbereich, der Reentrance verhindert.



  • Dann setz Dir doch ein Flag in Deinem Datenbereich, der Reentrance verhindert.

    Ok. Das hatte ich schon getestet. Hat nicht funktioniert. Aufgrund deines Post habe ich es nochmals getestet. Habe da noch ein anderes Problem: Wenn ich ich den Aufruf von DeleteTimerQueueTimer() mit completionEvent = NULL aufrufe ist der Aufruf nicht erfolgreich? GetLastError liefert mir 0 also ERROR_FILE_NOT_FOUND.

    Was will mir das sagen?


  • Mod

    Dann wird Dir nichts anderes übrig bleiben als ein Flag zu setzen das dem nächsten Aufruf signalisiert: Nun ist nichts mehr zu tun...


Log in to reply