关于Qt QThread 和MovetoThread的区别导致videocapture读取为空帧。

1 相同和区别

都是创建一个线程,拥有线程的各个特点,QThread需要重现run(循环函数,override 比virtual 好,因为QT编译器会帮助你显示错误),否则跟一个类没啥区别。MoveToThread不需要run,他的调用函数都是在创建线程里实现(代码写起来非常快)。

2 问题

MovetoThread需要继承QObject类,而QThread需要继承QThread类,我在运行调用opencv videocapture类一个录像应用程序时,分别使用一个定时器的MovetoThread线程和QThread的run线程。发现在资源紧张时定时器并不能按时启动(QTimer 在耽误时间后忽然发动多次,导致videocapture抓不到数据帧),而QThread的run线程里使用wait()循环,虽然难以掌握,但CPU资源紧张时不会把以前缺失的读取次数恢复。

3 解决方法

使用QThread线程可以解决这个问题,另外如果是有信号和槽,一定要用MoveToThread,可以单次定时器,QTimer::singleshot(。。。)函数;,不过每次读取videocapture数据后都要执行一次这个函数。

备注:Qt里面的QTimer在使用时要慎重(最好不要用连续定时器,折腾了一天才找出问题),他会受CPU资源影响。

猜你喜欢

转载自blog.csdn.net/jb_mai/article/details/125186476