Python 无法关闭xbmc中的线程:

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

我需要一些关于如何终止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()
你知道当我按下退格键时,如何终止线程吗


我需要使用什么方法终止或终止线程?

没有方法可以终止或终止线程。通常,您需要做的是如何向线程指示它应该关闭,并在线程本身中包含检查该指示的代码,并在收到该指示时优雅地关闭线程

但是,这并不容易应用到代码中,因为线程函数的大部分运行时间都花在单个阻塞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()