Python 无法关闭xbmc中的线程:
我需要一些关于如何终止xbmc媒体应用程序线程的帮助,因为我正在使用python 2.6版。当我点击键盘上的回车键时,我可以打开线程,但当我点击退格键时,我无法终止线程 代码如下:Python 无法关闭xbmc中的线程:,python,python-2.7,xbmc,Python,Python 2.7,Xbmc,我需要一些关于如何终止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.slee
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()
你知道当我按下退格键时,如何终止线程吗
我需要使用什么方法终止或终止线程?没有方法可以终止或终止线程。通常,您需要做的是如何向线程指示它应该关闭,并在线程本身中包含检查该指示的代码,并在收到该指示时优雅地关闭线程 但是,这并不容易应用到代码中,因为线程函数的大部分运行时间都花在单个阻塞I/O调用中。您可以做的是在一个单独的进程中进行调用,该进程可以终止,而不是在一个单独的线程中。这样,线程可以在循环中等待进程完成,但也可以等待主线程发出的终止信号 通常我会建议将整个线程化函数移动到一个单独的进程中,但看起来您正在尝试从线程更新GUI元素,这可能无法在单独的进程中正常工作。(不过,通常它也不能从单独的线程正常工作。)
非常感谢,当我尝试在if event.is_set()的if语句上运行代码时,出现了一个问题。以下是错误:
注意:忽略此选项可能导致内存泄漏!错误类型:错误内容:('invalid syntax',('C:\\Users\\user\\AppData\\Roaming\\XBMC\\addons\\script.tvguide\\test.py',972,35',if event.is_set()\n'))
。你知道我为什么会出错吗?与此代码有关:event=threading.event()
@user3788310对不起,我打错了<代码>如果event.is_set()应该是如果event.is_set():
。没有附加的:
。
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()