平时使用sleep多一些,如缓冲满了,等一会再送。while(缓冲满了){sleep(MS)};
某个任务,20毫秒执行一次, while(TRUE){ 做任务(用了1毫秒),sleep(18,19毫秒)};
几乎很少使用定时器;也感觉不出来定时器和sleep的差别。
今天在测试一个QT多线程任务的时候,场景如下:
100张快照,每20毫秒显示一个快照,使用GLwidget显示;当我使用
int i = 0; while(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毫秒,也就是下一次定时器时间到了还没执行完,那就先把任务执行完之后立即进入下一次定时器的处理逻辑;
标签:定时器,20,毫秒,sleep,关于,fun,快照 From: https://www.cnblogs.com/8335IT/p/16815153.html