[英]How to stop a thread in python?
我是 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
謝謝;)(如果我的英語不是很好(我是法語)或者我的代碼或解釋不是很容易理解或沒有遵循傳統的介紹,那么我很抱歉)。
祝你有美好的一天 :)
可能是你的 while 循環檢查end
過於頻繁,當你在根窗口被銷毀后嘗試將end
設置為 True 時可能會導致競爭條件。
您可以嘗試在 while 循環中添加一個短暫的 sleep 以減少出現競爭條件的機會:
while end == False:
...
sleep(0.1)
你在做什么是不安全的。 tkinter
不是線程安全的,運行任何tkinter
API 跨線程都有各種損壞的風險。
好的一面是,這里不需要線程。 在實際代碼中,您根本不會使用線程,您只需使用after
方法安排在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
更新的那一刻之外,任何時候都不會消耗任何有意義的資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.