2014-11-08 54 views
2

我正在为Python中的USB HID设备编写Linux驱动程序。该设备有两种发送数据的方式,这两种方式都是必需的:功能报告(同步)和输入报告(异步)。使用hidapi Cython库我只有一个设备实例需要使用,但我需要为hid.read()设置一个侦听器,该侦听器将不断运行并允许应用程序随时调用同步方法以发送特性报告。两个线程,一个对象

目前我在一个线程和另一个同步调用中的侦听器。当我运行该程序时,我的同步调用不会发生,尽管如果我从不启动侦听器,它们仍可以正常工作。所以看起来监听线程正在接管。

下面是一个令人不安的一段代码:

app.py

# app.py 
import threading 
import time 
import myhiddriver 

# Code that sets mydevice 

class Reader: 
    def start(self, device): 
    self.requests = myhiddriver.DeviceRequest(device) 
    # Wait a bit before firing, for testing 
    time.sleep(3) 
    self.requests.request_swipe_card() 

    def start_listener(self, device): 
    self.listener = myhiddriver.DeviceListener(device) 

reader = Reader() 
thread1 = threading.Thread(target=reader.start, args=(mydevice,)) 
thread1.daemon = True 
thread2 = threading.Thread(target=reader.start_listener, args=(mydevice,)) 
thread2.daemon = True 
thread1.start() 
thread2.start() 

# Keep this puppy running 
while True: 
    pass 

myhiddriver.py

import threading 

LOCK = threading.Lock() 

class DeviceRequest: 
    def __init__(self, device): 
    # Lock it up first 
    LOCK.acquire() 
    self.device = device 
    LOCK.release() 

    def request_swipe_card(self): 
    # Lock this up too 
    LOCK.acquire() 
    self.device.set_feature_report(insert data here) 
    LOCK.release() 

class DeviceListener: 
    def __init__(self, device): 
    # Lock me up 
    LOCK.acquire() 
    self.device = device 
    self.start_listener() 
    LOCK.release() 

    def start_listener(self): 
    while True: 
     # Should I be locking this up? 
     LOCK.acquire() 
     data = self.device.read(255) 
     LOCK.release() 
     if data: 
     print data 
     else: 
     pass 

我的问题:为什么我的同步调用( request_swipe_card)不通过?或者,我怎样才能更好地构建这个拥有无限的侦听器并且能够在同一个对象上进行同步调用的能力?

回答

3

从代码的外观上来看,这是因为你锁起来

当状态被解锁,获得()将状态更改为锁定,并立即 回报。当状态被锁定,获得()块,直到 调用release()在另一个线程它更改为解锁

现在的问题是:

class DeviceListener: 
    def __init__(self, device): 
    LOCK.acquire() # first you lock it up 
    self.device = device 
    self.start_listener() 
    LOCK.release() 

    def start_listener(self): 
    while True: # because of the loop, the lock wouldn't get release even if the LOCK below doesn't exist 
     LOCK.acquire() # it end up blocking here and oops, it locked up xD 
     data = self.device.read(255) # so it wouldn't be able to read here 
     LOCK.release() 
     if data: 
     print data 
     else: 
     pass 

request_swipe_card最终被在另一个线程中调用,它最终会阻塞在那里

def request_swipe_card(self): 
    LOCK.acquire() # right here xD 
    self.device.set_feature_report(insert data here) 
    LOCK.release() 
+0

由于我拥有多核处理器的豪华感,所以我最终选择了多处理方向,但这是有道理的。谢谢! – 2014-11-08 23:44:40

相关问题