【问题标题】:How to stop a thread in python?如何停止python中的线程?
【发布时间】:2020-11-02 20:04:33
【问题描述】:

我是 Python 的初学者。 我使用 Tkinter 进行编码。我想用 "threading" 扩展来改进我的程序。 然而,在我的一些程序中,如果我离开 Tkinter 窗口,程序仍在运行。 我想知道如何阻止它。我猜这是仍在运行的线程。我尝试了不同的方法来关闭线程,但我发现的唯一问题是创建一个错误(在我看来这不是一个好的解决方案):)。

我想知道是否存在类似以下的指令来停止线程。

Thread(target=FinTemps).stop()

(我知道“停止”不起作用)

如果可以使用循环“while” 来停止线程,我试过了,但我不明白为什么它不起作用:

import tkinter as tk
from threading import Thread as Th
from time import *

global end
end=False

begining=time()

def screen():
    global end
    while end==False:
        chrono=time()-beginning
        if chrono<5:
            sentence.set("Hey !")
        elif chrono<8:
            sentence.set("What's up ?")

window=tk.Tk()
window.geometry("{}x{}".format(fenêtre.winfo_screenwidth(), window.winfo_screenheight()))
window.title("Test Tkinter & Thread")

sentence=tk.StringVar()
sentence.set("none")
GreatTitle=tk.Label(window, textvariable=sentence, width=500)

Th(target=screen).start()

GreatTitle.pack(expand=1)

window.mainloop()

end=True

谢谢你;) (如果我的英语不是很好(我是法国人),或者我的代码或解释不是很容易理解或者没有遵循传统的介绍,很抱歉)。

祝你有美好的一天:)

【问题讨论】:

标签: python multithreading tkinter


【解决方案1】:

你所做的并不安全。 tkinter 不是线程安全的,并且运行 any tkinter API 跨线程存在各种损坏的风险。

好的一面是,这里不需要线程。在实际代码中,您根本不会使用线程,您只需使用the after method 安排在tkinter 的事件循环上发生更改,从而将您的代码简化为:

import tkinter as tk

window=tk.Tk()
window.geometry("{}x{}".format(window.winfo_screenwidth(), window.winfo_screenheight()))
window.title("Test Tkinter & Thread")

sentence=tk.StringVar()
sentence.set("none")
GreatTitle=tk.Label(window, textvariable=sentence, width=500)

GreatTitle.pack(expand=1)

window.after(0, sentence.set, "Hey !")        # Happens almost immediately, as in thread case
window.after(5000, sentence.set, "What's up ?")  # Delays five seconds, as in thread case
window.mainloop()

这也比你的效率高得多;如所写,您的线程将永远旋转,只要允许这样做,就会不断循环而不会暂停,从而保持核心始终以 100% 运行; GUI 本身会运行得更慢,因为当另一个线程持有 GIL 时它无法完成大部分工作。使用.after,除了事件触发和sentence 更新的那一刻,任何时候都不会消耗任何有意义的资源。

【讨论】:

    【解决方案2】:

    可能是你的while循环检查end太频繁了,当你在根窗口被破坏后尝试将end设置为True时,可能会导致竞争条件。

    您可以尝试在 while 循环中添加一个短暂的睡眠以减少竞争条件的机会:

    while end == False:
        ...
        sleep(0.1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2014-08-22
      相关资源
      最近更新 更多