Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我想在一个按钮上运行并杀死一个线程_Python_Multithreading_Tkinter - Fatal编程技术网

Python 我想在一个按钮上运行并杀死一个线程

Python 我想在一个按钮上运行并杀死一个线程,python,multithreading,tkinter,Python,Multithreading,Tkinter,我有一个程序,它应该通过串行连接将一些数据点发送到arduino,arduino将控制一些电机移动。我可以单独发送控制信号,也可以通过txt文件发送,txt文件将重复运行,直到文件完成。运行txt文件时,我希望能够像暂停或停止按钮一样退出循环。我认为最好的方法是通过一个我可以关闭的线程。我从来没有做过任何线程之前,我的初步尝试没有工作。下面是发送文件数据的函数 def send_file(): # Global vars global moto1pos global mo

我有一个程序,它应该通过串行连接将一些数据点发送到arduino,arduino将控制一些电机移动。我可以单独发送控制信号,也可以通过txt文件发送,txt文件将重复运行,直到文件完成。运行txt文件时,我希望能够像暂停或停止按钮一样退出循环。我认为最好的方法是通过一个我可以关闭的线程。我从来没有做过任何线程之前,我的初步尝试没有工作。下面是发送文件数据的函数

def send_file():
    # Global vars
    global moto1pos
    global motor2pos
    # Set Ready value
    global isready
    # Get File location
    program_file_name = file_list.get('active')
    file_path = "/home/evan/Documents/bar_text_files/"
    program_file = Path(file_path + program_file_name)
    file = open(program_file)
    pos1 = []
    pos2 = []
    speed1 = []
    speed2 = []
    accel1 = []
    accel2 = []
    for each in file:
        vals = each.split()
        pos1.append(int(vals[0]))
        pos2.append(int(vals[1]))
        speed1.append(int(vals[2]))
        speed2.append(int(vals[3]))
        accel1.append(int(vals[4]))
        accel2.append(int(vals[5]))
    # Send file values
    try:
        while isready == 1:
            for i in range(len(pos1)):
                print("Step: " + str(i+1))
                data = struct.pack("!llhhhh", pos1[i], pos2[i], speed1[i], speed2[i], accel1[i], accel2[i])
                ser.write(data)

                try:
                    pos1time = abs(pos1[i]/speed1[i])
                except:
                    pos1time = 0
                try:
                    pos2time = abs(pos2[i]/speed2[i])
                except:
                    pos2time = 0
            time_array = (pos1time, pos2time)
            time.sleep(max(time_array))
            motor1pos = ser.readline()
            motor2pos = ser.readline()
            if i < (len(pos1)-1):
                isready = ord(ser.read(1))
            else:
                isready = 0
except:
    print("Error: data not sent. Check serial port is open")
下面是我希望线程被终止的停止函数:

def stop():
    try:
        global isready
        isready = 0
        t.kill()
    except:
        print("Error: thread wasn't killed")
我知道你不应该杀死一个线程,但是数据不是很重要。更重要的是在有东西坏之前停止马达

tkinter中的按钮是:

run_file_butt = tk.Button(master = file_frame, text = "Run File", command = thread)
当我点击按钮时,程序运行,但停止功能不停止运动

问题:按下按钮运行并终止线程

没有所谓的
.kill(…

开始将您的
def send_文件(…
a
Thread对象
,它正在等待您的命令

注意:目前,您的内部
,而isready==1:
不会通过使用
m.set\u state('stop')
停止
必须启动
线程中的
对象:

if __name__ == '__main__':
    m = MotorControl()

您的
tk.按钮应该如下所示:

tk.Button(text = "Run File", command = lambda:m.set_state('start'))
tk.Button(text = "Stop File", command = lambda:m.set_state('stop'))
tk.Button(text = "Terminate", command = m.terminate)
问题:按下按钮运行并终止线程

没有所谓的
.kill(…

开始将您的
def send_文件(…
a
Thread对象
,它正在等待您的命令

注意:目前,您的内部
,而isready==1:
不会通过使用
m.set\u state('stop')
停止
必须启动
线程中的
对象:

if __name__ == '__main__':
    m = MotorControl()

您的
tk.按钮应该如下所示:

tk.Button(text = "Run File", command = lambda:m.set_state('start'))
tk.Button(text = "Stop File", command = lambda:m.set_state('stop'))
tk.Button(text = "Terminate", command = m.terminate)

我的答案很简单,因为我对线程和使用线程的独特环境有着简单的理解。我没有以我希望的方式终止线程,而是在send_file函数的发送行中添加了另一条条件语句

    while isready == 1:
        for i in range(len(pos1)):
            if motorstop == False:
                print("Step: " + str(i+1))
                #data = struct.pack('!llllhhhhhhhh', pos1[i], pos2[i], pos3[i], pos4[i], speed1[i], speed2[i], speed3[i], speed[4], accel1[i], accel2[i], accel3[i], accel4[i])
                data = struct.pack("!llhhhh", pos1[i], pos2[i], speed1[i], speed2[i], accel1[i], accel2[i])
                ser.write(data)
            else:
                isready = 0
                break
我已将我的stop()func更新为以下内容:

def stop():
    try:
        global motorstop
        global t
        motorstop = True
        t.join()
    except:
        print("Error: thread wasn't killed")
我不确定它是如何工作的,但它比@stovefl提到的要简单得多


有了这段代码,由于该函数基本上处于休眠状态,因此它可以运行,但不会发送任何新信息,然后将运行。join()在下一次迭代之后。

由于我对线程的简单理解和使用线程的独特环境,我的答案很简单。我没有以我希望的方式终止线程,而是在send_file函数的发送行中添加了另一条条件语句

    while isready == 1:
        for i in range(len(pos1)):
            if motorstop == False:
                print("Step: " + str(i+1))
                #data = struct.pack('!llllhhhhhhhh', pos1[i], pos2[i], pos3[i], pos4[i], speed1[i], speed2[i], speed3[i], speed[4], accel1[i], accel2[i], accel3[i], accel4[i])
                data = struct.pack("!llhhhh", pos1[i], pos2[i], speed1[i], speed2[i], accel1[i], accel2[i])
                ser.write(data)
            else:
                isready = 0
                break
我已将我的stop()func更新为以下内容:

def stop():
    try:
        global motorstop
        global t
        motorstop = True
        t.join()
    except:
        print("Error: thread wasn't killed")
我不确定它是如何工作的,但它比@stovefl提到的要简单得多


有了这段代码,由于该函数基本上处于休眠状态,因此它可以运行,但不会发送任何新信息,然后将运行。join()在下一次迭代之后。

阅读并确认,因此我无法传递带有参数的命令,当我删除参数并使命令运行时,什么都不会发生。它不会发送文件,并且在手动关闭gui之前,在我等待它的至少30秒钟内,它不会给出错误。您没有定义变量
t
在您的
stop()
函数.Re的定义中,“我认为最好的方法是通过线程。”我不会。假设你说的是在台式PC或移动设备上运行的某种GUI应用程序,那么我会使用定期发送任何需要发送的内容。阅读并确定,这样我就无法传递带参数的命令,当我删除参数并使命令运行时,什么都不会发生。它不会发生发送文件时,在手动关闭gui之前我等待了至少30秒的时间内,它不会出现错误。您没有在
stop()
函数的定义中定义变量
t
。Re,“我认为最好的方法是通过线程。”我不会。假设你说的是在台式PC或移动设备上运行的某种GUI应用程序,那么我会使用a定期发送任何需要发送的内容。