如何制作一个线程杀死另一个线程?

时间:2014-08-08 19:25:53

标签: python multithreading python-2.7 tkinter

如何让一个线程杀死另一个?

这是一个示例代码,

1-开始t1

2 - 开始t2

3 - t2完成后。用t3杀死t1

有可能我完全困惑并且弄乱大时间。 :-) 请告知是否是这种情况,我应该遵循什么方法而不是我现在正在做什么。感谢。

import Tkinter
import ttk
import time
import threading
import sys


def task():
    root = Tkinter.Tk()
    ft = ttk.Frame()
    ft.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
    pb_hD = ttk.Progressbar(ft, orient='horizontal', mode='indeterminate')
    pb_hD.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
    pb_hD.start(10)
    root.mainloop()


def destroy():
    global t1
    # here it should be something like t1.kill()

def process_of_unkown_duration():
    time.sleep(5)
    print 'Done'

def Main():
    t1=threading.Thread(target=task,args=())
    t2=threading.Thread(target=process_of_unkown_duration,args=())
    t3=threading.Thread(target=destroy,args=())
    t1.start()
    t2.start()
    t2.join()
    t3.start()

if __name__ == '__main__':
    Main()

1 个答案:

答案 0 :(得分:3)

您甚至不需要创建三个甚至两个线程。只需在主线程中运行mainloop,并创建一个线程来执行杀死mainloop的后台任务,方法是将root对象传递给后台线程,然后调用root.quit()

import Tkinter
import ttk
import time
import threading
import sys


def task(root):
    ft = ttk.Frame()
    ft.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
    pb_hD = ttk.Progressbar(ft, orient='horizontal', mode='indeterminate')
    pb_hD.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP)
    pb_hD.start(10)
    root.mainloop()

def process_of_unkown_duration(root):
    time.sleep(5)
    print 'Done'
    root.quit()

def Main():
    root = Tkinter.Tk()
    t1=threading.Thread(target=process_of_unkown_duration, args=(root,))
    t1.start()
    task(root)  # This will block while the mainloop runs
    t1.join()

if __name__ == '__main__':
    Main()