qt定时器以及信号与槽注意事项之一

在做项目时遇到以下场景:
点击按钮播放视频,同时开始定时器,视频结束暂停定时器,等待动态库返回结果,等待5s后再重新打开定时器,进行下一轮的检测循环。
但这时就遇到了一个问题,在程序进入动态库之后并成功获取结果后定时器没有重新开始,一开始我以为是我没有重新start()定时器,当重新在动态库执行函数的末尾加上start()后又出现了如下错误:
QObject::startTimer: Timers cannot be started from another thread
意思就是:QObject::startTimer:无法从其他线程启动计时器
百度发现是qt定时器不能跨线程调用,也就是子线程不能开启主线程的定时器。
既然不能跨线程调用,那我就用信号与槽机制好了,动态库子线程调用完后发出信号,主线程接收到子线程的信号后就在主线程执行start();重新开始定时器。然而为图方便我用的是Lambda表达式,

                connect(this,this->time_signal,[=](){
                   time_start();
                });

执行后发现依然出现Timers cannot be started from another thread,询问前辈后得知,是因为用Lambda表达式的话是从信号当前的线程处执行“槽函数”,也就是说我用了Lambda表达式后是从子线程动态库中执行start()函数,即使我把信号与槽connect函数写在主线程中也没用。
建议我使用类方法的方式去写,并告诉我信号与槽函数还有第五个参数,可以告诉槽函数是走哪个线程
点击后发现是qt定时器以及信号与槽注意事项之一_第1张图片

你可能感兴趣的:(qt,开发语言,单片机)