我对libusb很陌生,所以并不是非常理解它。我正在尝试进行一些USB通信。
我正在使用热插拔功能,这个功能运行得相当好。因此,我想当我检测到设备到达事件时,在另一个线程上使用C++11异步特性进行所有与USB的通信,以便我可以使用同步I/O与多个设备简化代码。他们的异步I/O有点令人困惑。希望我能够使用C++异步特性进行同步I/O。
但是,我遇到了一个问题,一些libusb调用似乎在C++11异步特性中运行时会挂起。当它没有运行在C++11异步特性中时,它可以正常工作而没有任何问题。
因此,我认为问题出在我的C++11异步特性代码上。
以下是我的热插拔回调函数:
使用此代码时,它会在
输出如下:
主要代码如下:
请注意,这份代码更多的是原型性质,因此代码质量并不是很好。它仍处于对 libusb 的探索阶段。
我正在使用热插拔功能,这个功能运行得相当好。因此,我想当我检测到设备到达事件时,在另一个线程上使用C++11异步特性进行所有与USB的通信,以便我可以使用同步I/O与多个设备简化代码。他们的异步I/O有点令人困惑。希望我能够使用C++异步特性进行同步I/O。
但是,我遇到了一个问题,一些libusb调用似乎在C++11异步特性中运行时会挂起。当它没有运行在C++11异步特性中时,它可以正常工作而没有任何问题。
因此,我认为问题出在我的C++11异步特性代码上。
以下是我的热插拔回调函数:
int LIBUSB_CALL hotplug_callback(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data)
{
std::future<void> result(std::async([] (libusb_device *d) {
libusb_device_handle *h;
printf("%s\n", "Opening");
int rc = libusb_open(d, &h);
if(rc != LIBUSB_SUCCESS) {
printf("ERROR: %s\n", libusb_error_name(rc));
return;
}
printf("%s\n", "Opened");
printf("%s\n", "Closing");
libusb_close(h);
printf("%s\n", "Closed!");
}, dev));
result.get();
return 0;
}
使用此代码时,它会在
libusb_close
处挂起。输出如下:
Opening
Opened
Closing
主要代码如下:
int main(int argc, char* argv[]) {
int vendor_id = 0x1234;
int product_id = 0x4556;
libusb_hotplug_callback_handle *hp = nullptr;
libusb_context *context = nullptr;
int rc = libusb_init(&context);
if(rc < 0)
{
return rc;
}
libusb_set_debug(context, LIBUSB_LOG_LEVEL_WARNING);
rc = libusb_hotplug_register_callback(
context,
LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED,
LIBUSB_HOTPLUG_NO_FLAGS,
vendor_id,
product_id,
LIBUSB_HOTPLUG_MATCH_ANY,
hotplug_callback,
NULL,
hp
);
if (LIBUSB_SUCCESS != rc) {
libusb_exit (context);
return rc;
}
while(1) {
rc = libusb_handle_events(context);
}
return 0;
}
请注意,这份代码更多的是原型性质,因此代码质量并不是很好。它仍处于对 libusb 的探索阶段。