无法在xbmc中关闭线程:

时间:2014-07-03 15:30:05

标签: 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.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()

当我按下退格按钮时,你知道我怎么能杀死或终止线程吗?

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

1 个答案:

答案 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()