我想创建自动更新USB设备列表的模块(不仅是大容量存储)。现在它非常粗鲁 - 它有额外的线程,在1秒后更新设备列表。但也许您知道如何处理一些生成操作系统的插件事件(例如Windows XP及更高版本)或其他如何简化此过程的方法。谢谢你的时间!
答案 0 :(得分:5)
这个问题似乎是半设计,半实现。看起来你最关心的是找到像jUSB这样的Java USB服务来管理来自系统的hotplug事件,让你有一个通过inversion of control调用的事件,而不是运行一个热情的线程,迭代地在后台轮询系统。
你所寻求的支持was implemented back in 2005 as JSR-80,并且似乎依赖于所有超越其商业支持的伟大项目,javax-usb
on SourceForge。请注意,在他们的玩具示例中(在javax-usb-example/src/ShowTopology.java
中),他们的首选模型仍然是基于轮询的。
javax.usb
中,我们发现了这一点:
#如果应该使用轮询而不是等待热插拔 通知。
#某些内核版本存在错误,并且在更新之前不会更新设备节点 唤醒等待设备文件的线程后的几秒钟。 如果您没有在中等负载系统上获得热插拔事件, 使用民意调查。
#注意,由于新的(buggy?)内核行为破坏了javax.usb,因此默认为 真的!
#如果您知道您的内核没有损坏,您可以将其设置为false。
#com.ibm.jusb.os.linux.LinuxUsbServices.topologyUpdateUsePolling = true
在javax-usb/src/javax/usb/event/UsbServicesListener.java
中,我们看到了一个用于设置USB事件监听器的模型,您可以在设备连接或从系统分离时继续使用。外部没有提供关于此是否有效的文档,然而,文档本身似乎大部分都是8年。
因此,合理的假设虽然支持理论上存在,但它是滞后的,陈旧的,并且迫切需要社区更新。这是SO上这个优秀社区可以帮助解决的事情,所以我将开始pointing directly to the project itself.
目前,在存在增强型硬件或热插拔支持之前,轮询仍然是最佳解决方案。