如何在一个线程中多次运行和停止同一个函数?

问题描述 投票:0回答:1

我编写了一个具有 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()

首先,我期望您可以多次启动和停止同一个线程。

python multithreading
1个回答
0
投票

线程一旦完成执行或停止就无法重新启动。

要实现用户可以多次启动和停止测量的功能,您需要在用户停止测量过程后每次启动测量过程时创建一个新线程。

您可以使用此代码:

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")
© www.soinside.com 2019 - 2024. All rights reserved.