楼主

[视觉算法] 【求助帖】tx2上开线程读图变慢的问题

[复制链接]
正式队员544750411
2020-11-14 19:24:16 只看该作者

马上注册,玩转Robomaster!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我在tx2上跑代码不开线程一条线跑下来不判别数字,光是video.read就得14ms
想着开个线程单独跑这不时间就快了,然后开线程
thread task1()
task1.join()
结果video.read直接飙升到40ms。
想着换个摄像头
买了迈德威视的UBS31的USB2.0摄像头
他们的摄像头得用他们的API不开线程也是14ms左右
开了线程20-30ms左右
跳转到指定楼层
推荐

[视觉算法] 【求助帖】tx2上开线程读图变慢的问题

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

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

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

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

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

使用道具 举报

沙发

[视觉算法] 【求助帖】tx2上开线程读图变慢的问题

[复制链接]
梯队队员闫召庆
2020-11-14 19:36:50 只看该作者

回帖奖励 +3 金钱

可以可以可以
板凳

[视觉算法] 【求助帖】tx2上开线程读图变慢的问题

[复制链接]
正式队员544750411
 楼主| 2020-11-14 19:43:23 只看该作者

帮帮忙呀兄弟们,我被折磨一个月了
5#

[视觉算法] 【求助帖】tx2上开线程读图变慢的问题

[复制链接]
梯队队员henry_23
2021-5-21 23:58:07 只看该作者
本帖最后由 henry_23 于 2021-5-22 00:00 编辑

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

还有会不会是线的问题,换 USB 3.0 的试试?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

触屏版 | 电脑版

Copyright © 2024 RoboMasters 版权所有 备案号 粤ICP备2022092332号

快速回复 返回顶部 返回列表