2

auf diese Daten Bezug zu schreiben, die den folgenden Code verwendet sind,Wie kann ich Threading verwenden, um Daten zu erhalten und Daten auf die gleiche Textdatei

12  41  58  82000 
12  41  58  190000 
12  41  58  301000 
12  41  58  416000 
12  41  58  524000 
12  41  58  632000 
12  41  58  741000 
12  41  58  849000 
12  41  58  959000 
12  41  59  65000 
12  41  59  174000 
12  41  59  281000 
12  41  59  389000 
12  41  59  496000 
12  41  59  605000 
12  41  59  711000 
12  41  59  820000 
12  41  59  927000 
12  42  0  36000 
12  42  0  143000 
12  42  0  252000 
12  42  0  360000 
12  42  0  469000 
12  42  0  577000 
12  42  0  685000 
12  42  0  793000 
12  42  0  901000 
12  42  1  9000 

der Code ist hier:

from datetime import datetime 
minute = 0 
second = 0 
microsecond=0 
fob=open('test_file_thread.txt','w') 

def st(): 
    global hour 
    global minute 
    exacttime = datetime.now() 
    hour = exacttime.hour 
    minute = exacttime.minute 

def nd(): 
    global second 
    global microsecond 
    exacttime = datetime.now() 
    second = exacttime.second 
    microsecond = exacttime.microsecond 

while True: 
    st() 
    nd() 
    fob.write(str(hour) + '  ' 
       + str(minute) + '  ' 
       + str(second) + '  ' 
       + str(microsecond) + '\n') 
    time.sleep(0.1) 

Jetzt möchte ich das gleiche mit Threading machen. Ich verwende zwei Threads, um Daten von zwei seriellen Ports zu erhalten. Da Threads parallel arbeiten, kann ich keine Textdatei erstellen, um die Daten Zeile für Zeile anzuordnen. Das heißt, ich möchte die Daten von der ersten seriellen Schnittstelle abrufen und sie dann in Zeile = 0 und Spalte = 0 einer Textdatei schreiben lese die Daten vom zweiten seriellen Port und schreibe sie in Zeile = 0 und Spalte = 5 (also genau vor Daten vom ersten Port), dann geh zur nächsten Zeile (Zeile = 1) und wiederhole diesen Vorgang. Ich möchte etwas wie das "Zeitbeispiel" haben, das ich oben mit dem Lesen von der seriellen Schnittstelle gemacht habe. Das ist mein Code und ich weiß nicht, wie ich ihn beheben soll und wo ich den Befehl fob.write(str(x)+' ' +str(y)+'\n') schreiben kann, um alles in derselben Zeit in dieselbe Datei zu schreiben. Dank für jede Hilfe

import time, threading 
import threading 
import serial 
x=0 
y=0 
fob=open('test_file_thread.txt','w') 
ser1 = serial.Serial("COM5", baudrate=9600, timeout=1) 
ser2 = serial.Serial("COM4", baudrate=9600, timeout=0.25) 

def st(): 
    global x 
    while True: 
     x = ser1.readline() 
def nd(): 
    global y 
    while True: 
     y= ser2.readline() 

threading.Timer(0, st).start() 
threading.Timer(0, nd).start() 
fob.write(str(x)+'  ' +str(y)+'\n') 
+0

Wenn die beiden Threads seriellen Ports lesen gleichzeitig laufen und wahrscheinlich Daten mit unterschiedlichen Geschwindigkeiten zu erzeugen, warum Sie wollen Daten aus dem ersten Port zu tun, neben Daten aus dem zweiten Port om der gleichen Linie, die wahrscheinlich gelesen zu einem anderen Zeitpunkt (oder vielleicht noch nicht einmal gelesen)? Wie auch immer, die Art und Weise, wie diese Art von Problem normalerweise behandelt wird, besteht darin, die Daten in eine "Queue.Queue" in den verschiedenen Threads zu setzen und dann Daten daraus in einem anderen zu erhalten (und in eine Datei in letzterem zu schreiben). – martineau

+0

In Bezug auf Ihre Frage, wie es im Code geschrieben ist, arbeiten die zwei seriellen Schnittstellen mit unterschiedlichen Timeouts. Aber diese Zeiten sind miteinander verbunden. Es ist nicht notwendig, wenn eine Variable aktualisiert wird, eine andere erhält auch einen neuen Wert; es kann wiederholt werden. Stellen Sie sich vor, dass Sie laufen. Eine Variable kann Ihre Herzfrequenz sein und eine andere kann Ihre Geschwindigkeit sein. In diesem Beispiel ist es möglich, dass sich Ihre Geschwindigkeit plötzlich ändert, während sich Ihre Herzfrequenz allmählich ändert. Sie würden also für ein paar Sekunden die gleiche Herzfrequenz haben, während Ihre Geschwindigkeit in all diesen Sekunden geändert wurde. –

Antwort

2

Sie sollten eine Queue verwenden, tatsächlich zwei von ihnen!

from Queue import Queue 
... 
ST_Q = Queue() 
MD_Q = Queue() 

def st(): 
    ST_Q.put(ser1.readline()) 

def md(): 
    MD_Q.put(ser2.readline()) 

threading.Timer(0, st).start() 
threading.Timer(0, nd).start() 
#while loop here?  
fob.write(str(ST_Q.get())+'  ' +str(MD_Q.get())+'\n') 
+0

'threading.Timer's führen nur die angegebene Funktion nach der Verzögerung _once_ aus, sie werden sie nicht wiederholt aufrufen. – martineau

1

Danke Yoav Glazner Eigentlich habe ich einen neuen Weg gefunden, dass ich auch eine gute Lösung ist erraten. Ich denke darüber nach, einen neuen Thread nur zum Schreiben zu widmen. Es hat für mich funktioniert. Was denken Sie?

import time, threading 
import threading 
from datetime import datetime 
hour=0 
minute = 0 
second = 0 
microsecond=0 
fob=open('test_file_thread.txt','w') 

def st(): 
    global hour 
    global minute 
    while True: 

     exacttime = datetime.now() 
     hour = exacttime.hour 
     minute = exacttime.minute 

def nd(): 
    global second 
    global microsecond 
    while True: 

     exacttime = datetime.now() 
     second = exacttime.second 
     microsecond = exacttime.microsecond 

def hd(): 
    while True: 
     fob.write(str(hour) + ' '+ str(minute) + ' '+ str(second) + ' '+ str(microsecond) + '\n') 


threading.Timer(0, st).start() 
threading.Timer(0, nd).start() 
threading.Timer(0, hd).start() 
+0

Sie benötigen noch eine Möglichkeit, Ihren Haupt-Thread zu blockieren. vielleicht ruf ** mich an ** den * hd * thread an ... –

+0

Was könnte passieren, wenn ich den Hauptthread nicht blockiere und wenn ich nicht beitreten moechte oh 'hd' thread? Das Problem ist, dass ich Endlosschleife innerhalb "nd" und "st" verwende, also kann ich nicht warten, bis sie ihre Arbeiten beenden –

+0

Ich denke, dass, wenn sie Daemon-Threads sind, es nicht materieller wird, aber es lesbarer aussehen wird (es wird sagen, dass das Skript nicht * endet * :)) –

Verwandte Themen