2017-07-10 2 views
1

Ich mache das auf einem Raspberry Pi. Ich bin sehr neu bei Python Ich bin vor kurzem von Arduino nach Himbeere für dieses Projekt umgezogen.Wie man etwas alle n Sekunden tut, während man etwas anderes mit Python macht

Ich möchte alle 5 Sekunden Temp zu Db senden, aber ich möchte die Grafik alle 1 Minute aktualisieren. Das Diagramm wird jedoch nicht aktualisiert, es bleibt in writeLog hängen. Ich habe print "loop" nach dem Start geschrieben aber es wird nicht angezeigt. Als nächstes schrieb ich print "hier" nach s.enter() in writeLog und es wird angezeigt.

Auch ich konnte plotNow nicht innerhalb von sched (Error nicht in Hauptschleife). Ich habe versucht Threading, aber ich konnte nicht 60sec für die Schleife bekommen.

Hier ist mein aktueller Code:

from matplotlib import pyplot as plt 
from datetime import datetime 

import MySQLdb 
import sched, time 

s = sched.scheduler(time.time, time.sleep) 

db = MySQLdb.connect(host="localhost", user="root", passwd="", db="log") 
cur = db.cursor() 

cnt = 0  

tempC = [] 

plt.ion() 
plt.figure(figsize=(10,5)) 


def writeLog(sc): 
    print "Insert to DB" 
    try: 
     st = "%.2f" % thermoTempC   
     cur.execute("""INSERT INTO history (Datetime, Temp_Degrees, Remarks) VALUES (%s, %s, %s)""", (datetime.now().strftime('%Y-%m-%d %H:%M:%S'), st, 'OK')) 
     db.commit() 
    except: 
     db.rollback() 
    s.enter(5,1,writeLog,(sc,))  


def plotNow(): 
    plt.clf() 
    plt.grid(True)   
    plt.title('Current Temp = {:.2f}$^\circ$C'.format(thermoTempC), fontsize=15) 
    plt.ylabel('Temperature(C)') 
    plt.xlabel('Time(min)') 
    plt.xlim(0,120) 
    plt.ylim(0,90)  
    plt.plot(tempC, 'r.-', label='Actual', color='red') 
    plt.legend(loc='upper right') 
    plt.show(block=False) 


while True:    
    thermoTempC = "32.00" 

    tempC.append(thermoTempC)  
    plotNow() 
    plt.pause(.1) 
    cnt = cnt+1 

    if(cnt>120): 
     tempC.pop(0)  

    s.enter(5,1,writeLog,(s,)) 
    s.run() 

Antwort

0

Ich konnte nicht die Duplikat-ish Frage finde ich suchte, also hier ist meine Antwort.

Sie können jeden Ihrer Prozesse in einen Thread einfügen, indem Sie das threading Modul verwenden.

Nehmen wir an, Sie haben eine send_temp_db und eine update_graph Funktionen, die jeweils die elementare Aktion des Sendens der Temperatur einmal durchführen und die Grafik einmal aktualisieren.

Sie müssen zwei Funktionen definieren, die kontinuierlich betrieben werden:

def send_temp_loop(): 
    while True: 
     send_temp_db(...) 
     time.sleep(5) # wait for 5s 

def update_graph_loop(): 
    while True: 
     update_graph(...) 
     time.sleep(60) # wait for 60s 

Dann für beide Aktionen einen Thread erstellen, und führen Sie die zwei Threads.

thread_temp = threading.Thread(target=send_temp_loop) 
thread_graph = threading.Thread(target=update_graph_loop) 

thread_temp.start() 
thread_graph.start() 

thread_temp.join() 

Vergessen Sie nicht, join eines Ihrer Threads. Wenn nicht, wird das Programm direkt nach dem Start der beiden Threads beendet.

+0

auf thread_temp = threading.Thread (send_temp_loop) "Assert-Gruppe ist keine, Gruppenargument muss jetzt keine sein". In threading.Thread geändert (target = send_temp_loop). Außerdem wurde time.sleep (5000) in time.sleep (5) geändert. Mein einziges Problem ist jetzt, dass es das Diagramm nicht zeigt – IyaSheep

+0

@IyaSheep Versuchen Sie und fügen Sie 'plt.clear' in Ihrer' plotNow' Funktion hinzu. Ich bin mir nicht sicher, ob das Aktualisieren eines Graphen ein Schmerz im Nacken ist, aber ich habe das schon oft gemacht und es macht normalerweise den Trick. –

+1

Sie sollten 'time.sleep' nicht in einem Thread verwenden, der ein GUI-Fenster aktualisiert. – ImportanceOfBeingErnest

Verwandte Themen