关于定时器与线程

cotwin 2018-01-15 05:40:41
目前在主线程中用QObject::starttime(20)启动一个定时器,20毫秒触发一次。timerEvent里面对一个全局变量g_nNum加+1,并用qDebug()显示当前时间"A",显示时间到毫秒

另外创建了一个新线程myThread,继承于QThread,重写了run()函数,run()函数内用了一个死循环
while(1)
{
}
因为这个线程从始至终要一直运行。在循环内,一直判断全局变量g_nNum是否大于0,如果大于0,则执行g_nNum--,用qDebug()显示出当前时间"B",显示时间到毫秒。

按照我的想法,应该每次都是显示一次"A"再显示一次"B",但实际运行过程偶尔会有连续出现两次"A"再连续出现两次"B"的情况。而且这种方式程序占CPU资源比较严重,应该是线程myThread中死循环的原因。后来在循环中加了如下语句
while(1)
{
if(g_nNum > 0)
{
// 执行显示时间
g_nNum--;
}
else
{
usleep(1); // 重写的QThread::usleep
}
}
发现这样CPU资源占用情况好了很多,但是定时器显示内容A的间隔时间远大于设定时间20毫秒了,而且"A""B"显示也不是成对出现,上述连续出现两次A再出两次B的情况也还是有。

应该是新线程中run()函数处理对主线程中定时器有影响,但不知道有没有别的办法能够避免。
...全文
1794 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
张小飞Official 2018-01-23
  • 打赏
  • 举报
回复
有啊,这时候你用固定的时间肯定不行啊,这时候应该用条件变量来控制的。
走好每一步 2018-01-20
  • 打赏
  • 举报
回复
建议重新看下多线程
zhouxiao2009 2018-01-16
  • 打赏
  • 举报
回复
这是CPU调度的问题
qq_41123399 2018-01-16
  • 打赏
  • 举报
回复
厉害,又长见识了,
cotwin 2018-01-16
  • 打赏
  • 举报
回复
引用 1 楼 dext 的回复:
线程 修改变量 不同步?建议恶补 多线程编程
谢谢各位的回复。 目前涉及变量就一个,而且我在涉及线程内都做了互斥量锁定。 我的意图是定时器里做“读数据"处理,另外新开线程里做”数据处理“,所以我在定时器里对变量num+1,在新线程里作一直判断num是否大于0,如果大于0,则num-1。从qDebug()显示num数值上来看,num都能回0,但就是定时器定时处理时间不准了。 估计跟2楼兄弟说的一样,是CPU调度的问题。 我现在的目的就想要保证定时器定时“读数据”前提下,新线程内能够及时对新数据进行处理。不知道是不是我现在这种总的处理方式有问题。
dext 2018-01-15
  • 打赏
  • 举报
回复
线程 修改变量 不同步?建议恶补 多线程编程

16,201

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧