关于sleep和定时器

平时使用sleep多一些,如缓冲满了,等一会再送。while(缓冲满了){sleep(MS)};

某个任务,20毫秒执行一次, while(TRUE){ 做任务(用了1毫秒),sleep(18,19毫秒)};

几乎很少使用定时器;也感觉不出来定时器和sleep的差别。


今天在测试一个QT多线程任务的时候,场景如下:

100张快照,每20毫秒显示一个快照,使用GLwidget显示;当我使用

int i = 0while(i< 100)
{
    getpic();
    QGLWidget::update();
    std::sleep(20MS);
    i++;
}

我发现我的paintGL并没有能显示得到的快照;而是我这100张都送完了,才开始弹出窗口显示照片;

然后发现网上有这样一个帖子,说主线程SLEEP会卡主线程UI,

 

 随后我打印了处理线程ID:std::thread::id id = std::this_thread::get_id(); ID号看着UI的照片显示和主线程的ID一样

尝试使用QTimer 重写上边逻辑:

       定时器20毫秒,设置timeoutcallon(fun);也就是每20毫秒调用一次fun函数,然后fun的处理逻辑就是,取快照,触发绘制(update);测试UI果真能立即显示出来了;

      另外,当定时器超时处理函数fun内部的处理逻辑的耗时,大于定时器的间隔20毫秒的时候,不会直接咔掉fun,而是会执行完fun的;例如,定时器每没20毫秒读一张照片并显示,但是这个“读照片显示”的操作实际花了50毫秒,也就是下一次定时器时间到了还没执行完,那就先把任务执行完之后立即进入下一次定时器的处理逻辑;

 

posted on 2022-10-22 00:28  邗影  阅读(353)  评论(0编辑  收藏  举报

导航