簡體   English   中英

如何在python中停止線程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM