我编写了一个具有 GUI 循环(while run 循环)的程序,并且在该循环中另一个进程在单独的线程中启动。执行函数make_measurement,从测量设备读取数据。如果线程不活动则启动。用户可以停止线程中的测量循环(使用停止按钮),这在示例代码中通过检查条件 x[0]==11 进行模拟。运行代码后,两个循环(GUI 循环和 make_measurement 函数内的循环)都会顺利执行到线程停止的那一刻。 GUI 循环仍在运行,并且由于线程不活动,因此它想要再次启动该线程,但一个线程不能启动两次。在我的程序中,用户可以多次启动和停止 make_measurement,同时 GUI 循环仍然运行。我想我必须在每次启动/停止序列之后创建新线程,但如何编码?
这是 aqan 示例代码:
from threading import Thread, Event
from time import sleep
def make_measurement(n, x):
i=n
while i>0:
sleep(0.5)
i=i-1
x[0]=i
if event.is_set():
break
run=True
j=0
x=[0]
event=Event()
t=Thread(target=make_measurement, args=(20,x,))
#GUI loop
while run:
sleep(0.2)
#start measurement thread within loop
if not t.is_alive():
t.start()
print("Start")
j=j+1
print("iteration: " +str(j), " number: " + str(x[0]))
if x[0]==11:
event.set()
首先,我期望您可以多次启动和停止同一个线程。
线程一旦完成执行或停止就无法重新启动。
要实现用户可以多次启动和停止测量的功能,您需要在用户停止测量过程后每次启动测量过程时创建一个新线程。
您可以使用此代码:
from threading import Thread, Event
from time import sleep
def make_measurement(n, x, event):
i = n
while i > 0:
sleep(0.5)
i -= 1
x[0] = i
if event.is_set():
print("Measurement stopped")
event.clear()
break
def start_measurement_thread(x, event):
t = Thread(target=make_measurement, args=(20, x, event))
t.start()
return t
run = True
j = 0
x = [0]
event = Event()
t = None # init thread var
while run:
sleep(0.2)
if t is None or not t.is_alive():
t = start_measurement_thread(x, event)
print("Start")
j += 1
print("iteration: " + str(j), " number: " + str(x[0]))
if x[0] == 11:
event.set()
t.join()
t = None # allow a new thread to be started in the next loop
if j >= 30: # condition to exit the GUI loop - you can use it if you need it
run = False
event.set() # stop the measurement if it is running
if t is not None:
t.join() # wait for the measurement thread to finish
print("End")