2017-06-20 1 views
0

Ich habe ein Tkinter-Programm, das acht Klassen hat. Sechs dieser Klassen sind Seiten, daher hat jede Seite der GUI ihre eigene Klasse. Ich muss Multiprocessing über die Klassen einrichten und ich muss die Prozesse gleichzeitig beitreten. Hier ist ein Beispiel für eine Klasse und mein Multiprozessing Setup:Python & Tkinter: Multiprocessing aus mehreren Klassen

class Page1(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     #setting up gas varible to read from 
     self.gas = minimalmodbus.Instrument("COM3", 1) 
     self.gas.serial.baudrate = 9600 
     self.gas.serial.bytesize = 8 
     self.gas.serial.parity = serial.PARITY_NONE 
     self.gas.serial.stopbits = 1 
     self.gas.serial.timeout = 0.25 
     self.gas.mode = minimalmodbus.MODE_RTU 

     self.timer_button = tk.Button(self, text='Start', command=self.toggle) 
     self.timer_button.pack(side="top") 

    def toggle(self): 
      all_thread(self.gas) 

def all_thread(a_gas): 
    thread = threading.Thread(target=all_process(a_gas)) 

def all_process(a_gas): 
    gas_list = [] 
    gas_list.append(a_gas) 
    processes = [] 
    while len(gas_list) > 0: 
     for sen in gas_list: 
      proc = Process(target=main_reader(sen)) 
      processes.append(proc) 
      proc.start() 
     for sen in processes: 
      sen.join() 
     time.sleep(1) 

def main_reader(gas_num): 
    read = gas_num.read_registers(0,42) 
    print(read) 

Dies funktioniert, bekomme ich alle die Ausgabe ich in der Konsole soll. Allerdings friert meine GUI ein und stürzt ab, wenn ich die timer_button drücke. Bin ich auf dem richtigen Weg/was mache ich falsch?

+0

Sie sagen, Ihre GUI Freezes und stürzt ab. Haben Sie eine Fehlermeldung oder einen Trackback, den wir sehen können? –

+0

Nun, ich habe angenommen, dass es abstürzt, weil ich die Verarbeitung falsch eingerichtet habe. Es gibt keine Ausgabe, wenn die GUI einfriert, ich muss sie mit Task-Manager schließen. Ich bin mir ziemlich sicher, dass es so ist, weil die GUI auf die Arbeit wartet, die nie stattfinden wird, weil die 'while' Schleife. – GreenSaber

+0

versuchen Sie, eine Funktion hinzuzufügen, die den Status des Prozesses anstelle von 'Join' überprüft. – brunormoreira

Antwort

2

Dieser Code:

thread = threading.Thread(target=all_process(a_gas)) 

... ist genau das gleiche wie dieser Code:

result = all_process(a_gas) 
thread = threading.Thread(target=result) 

Sie den Befehl nicht in einem Thread ausgeführt wird, weshalb das Programm friert. Sie müssen dem Ziel eine aufrufbare zuweisen. Wenn Sie Argumente übergeben müssen, verwenden args:

thread = threading.Thread(target=all_process, args=(a_gas,)) 

Dies alles wird in der Python-Dokumentation dokumentiert. Siehe https://docs.python.org/2/library/threading.html#threading.Thread

Sie haben das gleiche Problem, wenn Sie einen Prozess starten.

Dies:

proc = Process(target=main_reader(sen)) 

... ist genau das gleiche wie folgt aus:

result = main_reader(sen) 
proc = Process(target=result) 

So, wie Sie sind nicht Threads, die Sie verwenden auch keine Prozesse. Auch dies ist alles dokumentiert: https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process