具有异步采集的时间关键型 QT、UART、ISAAC 和 dll 的 C++ 处理策略
Posted
技术标签:
【中文标题】具有异步采集的时间关键型 QT、UART、ISAAC 和 dll 的 C++ 处理策略【英文标题】:C++ Treading strategy for time critical QT, UART, ISAAC and dll with async acquisition 【发布时间】:2020-08-26 12:13:12 【问题描述】:我正在开发使用以下 SDK 和“部件”的应用程序:
Qt 图形界面 UART 上的 Xbox one 控制器 一个 arduino 在 UART 上到期 ISAAC VO(https://docs.nvidia.com/isaac/isaac/packages/perception/doc/visual_odometry.html) 通过 dll 库 (https://www.phidgets.com/?&prodid=32) 访问的 IMU UVC V4L2 立体相机IMU 似乎只能通过 phidget Spacial API 访问,该 API 会自动线程化应用程序(线程频率精度较差)。
因为我的 Qt GUI 有一个时间相关的绘图,所以我使用 QTimer 线程化了更新绘图函数。
这是我的梦想:
main loop() (30Hz)
//Get (Async)
getControllerInput();(60Hz UART)
getQtInput();(60Hz)
getArduinoInput();(12Hz UART so sometimes compute with old datas)
getIMUInput();(250Hz UART throug Spatial API )
getCameraInputFromIsaac();(60Hz)
//Process (Sync in some parts)
ProcessIMURectification();(250Hz)
ProcessDataForIsaac();(60Hz)
SendIMUToIsaac();(60Hz)
SendCameraToIsaac();(60Hz)
ComputeIsaac();(30Hz)
GetIsaacOutup();(30Hz)
ProcessDataForArduinoAndQT();(60Hz)
//Output (Async)
SendDataToArduino();(60Hz UART)
SendDataToQt();(60Hz)
有了所有这些线程,我只是不想选择错误的方法,我尝试了 std lib 线程,还看到了一些关于 Futures/Promises Vs 的帖子。插座,但我不知道女巫是最好的。
我的问题是:
有没有办法优先处理线程以避免 Qt GUI 女巫获取大量资源时对时间要求不高。
某些线程方法是否比其他方法更节省资源(我在 jetson nano 上运行,所以库存资源不多)
我是否应该线程化一个 CUDA 函数在 GPU 上进行计算以充分利用 jetson nano 的潜力
主要问题:考虑到所有这些,有没有比另一种更好的线程化方式?
谢谢谢谢谢谢!
【问题讨论】:
* 是的,有:QThread::currentThread()->setPriority(QThread::HighPriority); * 是的。我会选择 QThread 线程管理器。 * 由你决定。但是为什么不保持 GUI 线程干净。* 我会使用 QThread,因为它对资源的要求最低。顺便说一句,这是 Qt 而不是 QT。 每个问题一个问题。这不是设计圆桌会议。 是的,你是对的,我想我唯一的问题是:在这种情况下,哪种线程方法是最好的?,cuda 认为这里有点越界了。 【参考方案1】:谢谢@Laszlo,是
mythread()
if(lasttime-time()<1/frequency)
pocess();
lasttime=time();
else
usleep((1/frequency) - (lasttime-time()) )
管理线程频率的最佳方法还是其他方法更好?
【讨论】:
知道了:Qt 线程具有我可以操纵的功能,再次感谢 :) 我将使用以下内容:QElapsedTimer 和 QThread::requestInterruption() 和 currentThread()->setPriority 和 QSemaphore 应该完成这项工作以上是关于具有异步采集的时间关键型 QT、UART、ISAAC 和 dll 的 C++ 处理策略的主要内容,如果未能解决你的问题,请参考以下文章