我需要一些关于如何杀死或终止xbmc媒体应用程序的线程的帮助,因为我正在使用python 2.6版。当我按下键盘上的输入按钮时,我能够打开线程,但是当我按下退格按钮时,我无法终止或终止线程。
以下是代码:
import urllib2
import StringIO
import threading
ACTION_ENTER = 7
ACTION_BACKSPACE = 110
def allchannels_timer(self):
for i in range(1):
time.sleep(0.3)
self.getControl(4202).setLabel("0%")
#DOWNLOAD THE XML SOURCE HERE
url = ADDON.getSetting('allchannel.url')
req = urllib2.Request(url)
response = urllib2.urlopen(req)
data = response.read()
response.close()
if action == ACTION_BACKSPACE:
if img1_yellow == False:
self.getControl(4202).setLabel("")
#cancel the connection and close the database
if action == ACTION_ENTER:
if img1_yellow == True:
self.thread = threading.Thread(target=self.allchannels_timer)
self.thread.setDaemon(True)
self.thread.start()
当我按下退格按钮时,你知道我怎么能杀死或终止线程吗?
我需要使用什么方法来终止或终止线程?
答案 0 :(得分:0)
没有可以杀死/终止线程的方法。通常你需要做的是如何向线程指示它应该关闭,并在线程本身中检查该指示的代码,并在收到线程时正常关闭线程。
但是,这不能轻易应用于您的代码,因为绝大多数的线程函数的运行时间都花费在单个阻塞I / O调用中。你可以做的是,在一个单独的进程中进行调用,可以终止,而不是单独的线程。这样,你的线程可以在一个循环中等待进程完成,但也等待主线程应该终止的信号。
通常我建议将整个线程函数移动到一个单独的进程,但看起来你正在尝试从线程更新GUI元素,这可能无法在单独的进程中正常工作。 (但是,通常它也不能从单独的线程中正常工作。)
import urllib2
import time
import threading
from multiprocessing import Process, Queue
ACTION_ENTER = 7
ACTION_BACKSPACE = 110
event = threading.Event()
def do_request(url, q):
req = urllib2.Request(url)
response = urllib2.urlopen(req)
data = response.read()
response.close()
q.put(data)
def allchannels_timer(self):
for i in range(1):
time.sleep(0.3)
self.getControl(4202).setLabel("0%")
#DOWNLOAD THE XML SOURCE HERE
url = ADDON.getSetting('allchannel.url')
q = Queue()
p = Process(target=do_request, args=(url, q))
p.start()
while p.is_alive():
if event.is_set():
p.terminate()
return
time.sleep(.3)
# Make sure you don't read from the queue after calling terminate()
data = q.get()
if action == ACTION_BACKSPACE:
if img1_yellow == False:
self.getControl(4202).setLabel("")
event.set()
self.thread.join()
if action == ACTION_ENTER:
if img1_yellow == True:
event.clear()
self.thread = threading.Thread(target=self.allchannels_timer)
self.thread.setDaemon(True)
self.thread.start()