从析构函数中停止python线程

时间:2014-04-07 12:53:34

标签: python multithreading

我对Python编程有些新意。我正在尝试制作一个脚本,它将使用dll在一个单独的线程中连续读取USB设备(因为这个类将导入到某些GUI应用程序中),如果有任何数据,它将调用回调函数。

我的问题是我想使用析构函数停止线程,我不确定其他更好的设计吗?如果有更好的方法,有没有人可以指出我?

我的设计计划在我的类可以导入的地方,然后调用run start start,一旦最后一个对象被销毁,线程就会停止。

# -*- coding: utf-8 -*-

import ctypes
import threading
import time

USB_VENDOR_ID  = 0x23ef
USB_PRODUCT_ID = 0x0001

class usb_dev_comm(threading.Thread):
    def __init__(self, callback_fun):
        self.hidDll = ctypes.WinDLL("AtUsbHid.dll")
        self.usb_dev_connected = 0
        self.usb_stopall = 0
        self.callback = callback_fun
        return

    def usb_dev_present(self):
        self.res = self.hidDll.findHidDevice(USB_VENDOR_ID, USB_PRODUCT_ID)
        if (self.res == True):
            self.usb_dev_connected = 1
        else:
            self.usb_dev_connected = 0
        return self.res

    def usb_dev_tx(self,data):
        self.res = self.hidDll.writeData(data)
        return self.res

    def usb_dev_rx(self):
        data = 0
        result = self.hidDll.readData(data)
        if (result == False):
            return False
        else:
            return data

    def run(self):
        while 1:
            self.usb_dev_present()
            print self.usb_dev_connected
            if(self.usb_dev_connected):
                data_rx = self.usb_dev_rx()
                print data_rx
            #time.sleep(0.001)
            time.sleep(1)

    def __del__(self):
        print "del:cleanup required"
        #TODO


if __name__ == "__main__":
    def data_print(data):
        print data

    device = usb_dev_comm(data_print)
    result = device.run()
    print result
    print device.usb_dev_connected

我尝试了介绍

    def run(self):
        while self.stop_thread:
            self.usb_dev_present()
            print self.usb_dev_connected
            if(self.usb_dev_connected):
                data_rx = self.usb_dev_rx()
                print data_rx
            #time.sleep(0.001)
            time.sleep(1)

    def __del__(self):
        self.stop_thread = 1
        print "del:cleanup required"
        #TODO

但这不起作用,因为我认为这会导致鸡蛋和鸡蛋问题

0 个答案:

没有答案