RoboMaster

标题: 【求助帖】tx2上开线程读图变慢的问题 [打印本页]

作者: 544750411    时间: 2020-11-14 19:24
标题: 【求助帖】tx2上开线程读图变慢的问题
我在tx2上跑代码不开线程一条线跑下来不判别数字,光是video.read就得14ms
想着开个线程单独跑这不时间就快了,然后开线程
thread task1()
task1.join()
结果video.read直接飙升到40ms。
想着换个摄像头
买了迈德威视的UBS31的USB2.0摄像头
他们的摄像头得用他们的API不开线程也是14ms左右
开了线程20-30ms左右

作者: 闫召庆    时间: 2020-11-14 19:36
可以可以可以

作者: 544750411    时间: 2020-11-14 19:43
闫召庆 发表于 2020-11-14 19:36
可以可以可以

帮帮忙呀兄弟们,我被折磨一个月了
作者: OldVincent    时间: 2021-1-25 20:09
  1. task1.join()
复制代码
会阻塞你当前的调用线程,直到task1执行完毕。这也就是说,如果你在主线程中thread task1;后直接调用它的join方法,相当于没有开启多线程
在这里提一下C++里多线程的知识:std::thread类在构造时就会创建一条线程并立即开始执行,并且该对象会一直处于与线程的绑定状态,直到join方法被调用或者detach方法被调用。

调用join方法,会要求调用该方法的线程等待该线程对象对应的线程执行完毕,才会继续向下执行,如果线程已经结束,则join方法会直接返回,主线程直接向下继续执行;如果调用detach方法,则会要求线程对象与线程分离

但是为什么要分离线程对象与线程呢?这是因为,如果线程尚未停止,但线程对象却已经析构,这个线程就会在事实上失去控制,就如同没有指针指向其的内存一样,会导致未定义行为,一般编译器编译出的程序的行为是直接停止。

所以,多线程的正确使用方式是:

1. 构造线程对象,这个时候子线程就会开始执行;
2. 主线程继续构造子线程对象,或者执行一些其他的操作;
3. 当主线程操作完成时,或者主线程需要用到子线程的操作结果时,调用子线程的join方法;

作者: henry_23    时间: 2021-5-21 23:58
本帖最后由 henry_23 于 2021-5-22 00:00 编辑

是不是 cv::waitKey()cv::imshow()的问题呢?感觉很玄学,好像使用过程中还是要手动停顿一下,不然太快电脑似乎反应不过来……

还有会不会是线的问题,换 USB 3.0 的试试?





欢迎光临 RoboMaster (https://bbs.robomaster.com/) Powered by Discuz! X3.2