Steuerungs-Skript

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
mobby
User
Beiträge: 76
Registriert: Donnerstag 17. April 2014, 09:43

@pillmuncher: Super, vielen Dank für die ausführliche Erklärung. Den Vorschlag habe ich so eingebaut :) Tip Top
Benutzeravatar
mobby
User
Beiträge: 76
Registriert: Donnerstag 17. April 2014, 09:43

Hey at all,

Update: Habe mein Steuerungsskript inzwischen so weit verbessert, dass sich alle Threads von alleine beenden, sobald dies im Steuerungsskript angewiesen wird. Dies wird über das in diesem Thema erarbeitete Objekt gelöst. Das funktioniert, weil ich in den Threads Aufgaben verteile die über eine While Schleife immer alle x Sekunden abgerufen werden. Bevor die Aufgabe ausgeführt wird, wird der status überprüft und falls er False sein sollte, mittels break die Schleife verlassen. So schließt sich auch automatisch der Thread. Nur jetzt habe ich ein Problem, sollte ich meinen Zähler entfernen und der Status springt auf False, wird mein einer Sub-Thread sofort beendet, da der sleep Timer im Millisekunden Bereich liegt, nur die Aufgabe in meinem Sub-Thread zum Schreiben in die Datenbank wird nur alle 5 / 10 / 15 Minuten abgerufen. Das bedeutet, dass der Sub-Thread und somit der komplette Thread für den Zähler nur bei Eintritt dieses Intervalls beendet wird. Will ich also Zähler 1 neu anlegen, muss ich warten bis das Intervall einmal abgelaufen ist, sonst ist der Thread noch aktiv und macht weiter, weil er wieder den Status auf True erhält.

Ich weiß ist alles etwas kompliziert erklärt, aber im Grunde geht es darum: Wie kann ich meinen Thread beenden, obwohl die Hauptaufgabe nur alle 5 Minuten ausgeführt wird? Hier mal meine bisherige Vorgehensweise. Dabei handelt es sich um einen Sub-Thread der sich selbst beenden soll, sobald status.get_status(x) auf False springt:

Code: Alles auswählen

def write_value(status, x, count, intervall, table_name):
    timestamp = int(time.time() / intervall) * intervall
    while True:
        timestamp += intervall
        time.sleep(max(0, timestamp-time.time()))
        s0_value = count.get_and_reset()
        datum = str(time.strftime("%d-%m-%Y"))
        uhrzeit = str(time.strftime("%H:%M:%S"))
        if status.get_status(x) == False:
            break
        else:
            db.insert_into_database(status, x, table_name, timestamp, datum, 
                uhrzeit, s0_value
            )
Vielen Dank für Hile !!!

Gruß
mobby
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@mobby: statt selbst was zu erfinden, nimm doch das, was es schon gibt und was dafür gemacht wurde. In Deinem Fall 'threading.Event':

Code: Alles auswählen

def write_value(event, x, count, intervall, table_name):
    timestamp = int(time.time() / intervall) * intervall
    while not event.wait(max(0, timestamp-time.time())):
        timestamp += intervall
        s0_value = count.get_and_reset()
        datum = str(time.strftime("%d-%m-%Y"))
        uhrzeit = str(time.strftime("%H:%M:%S"))
        db.insert_into_database(True, x, table_name, timestamp, datum, uhrzeit, s0_value)
und irgendwoanders:

Code: Alles auswählen

event.set() # beendet Thread quasi sofort
Benutzeravatar
mobby
User
Beiträge: 76
Registriert: Donnerstag 17. April 2014, 09:43

@Sirius3: Perfekt, nach genau sowas habe ich gesucht. Vielen Dank für den Hinweis, jetzt läuft alles tadellos! :)
Antworten