我正在为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)不通过?或者,我怎样才能更好地构建这个拥有无限的侦听器并且能够在同一个对象上进行同步调用的能力?
由于我拥有多核处理器的豪华感,所以我最终选择了多处理方向,但这是有道理的。谢谢! – 2014-11-08 23:44:40