我有一个有八个课程的Tkinter程序。其中六个类是页面,因此GUI的每个页面都有自己的类。我需要跨类设置多处理,我需要同时加入进程。这是一个类和我的多处理设置的示例:
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)
这有效,我在控制台中获得了我想要的所有输出。但是,当我按下timer_button
时,我的GUI会冻结并崩溃。我是在正确的轨道/我做错了什么?
答案 0 :(得分:2)
此代码:
thread = threading.Thread(target=all_process(a_gas))
...与此代码完全相同:
result = all_process(a_gas)
thread = threading.Thread(target=result)
您没有在线程中运行该命令,这就是您的程序冻结的原因。您必须将可调用分配给目标。如果您需要传递参数,请使用args
:
thread = threading.Thread(target=all_process, args=(a_gas,))
这一切都记录在python文档中。见https://docs.python.org/2/library/threading.html#threading.Thread
启动进程时遇到同样的问题。
此:
proc = Process(target=main_reader(sen))
...与此完全相同:
result = main_reader(sen)
proc = Process(target=result)
所以,就像你没有使用线程一样,你也没有使用进程。同样,这些都记录在案:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process