关于定时器与线程

时间:2023-01-06 19:13:47
目前在主线程中用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()函数处理对主线程中定时器有影响,但不知道有没有别的办法能够避免。

6 个解决方案

#1


[线程 修改变量 不同步?建议恶补 多线程编程, 这是CPU调度的问题,
引用 1 楼 dext 的回复:
线程 修改变量 不同步?建议恶补 多线程编程

谢谢各位的回复。
目前涉及变量就一个,而且我在涉及线程内都做了互斥量锁定。
我的意图是定时器里做“读数据"处理,另外新开线程里做”数据处理“,所以我在定时器里对变量num+1,在新线程里作一直判断num是否大于0,如果大于0,则num-1。从qDebug()显示num数值上来看,num都能回0,但就是定时器定时处理时间不准了。
估计跟2楼兄弟说的一样,是CPU调度的问题。
我现在的目的就想要保证定时器定时“读数据”前提下,新线程内能够及时对新数据进行处理。不知道是不是我现在这种总的处理方式有问题。, 厉害,又长见识了,, 建议重新看下多线程, 有啊,这时候你用固定的时间肯定不行啊,这时候应该用条件变量来控制的。]

#1


[线程 修改变量 不同步?建议恶补 多线程编程, 这是CPU调度的问题,
引用 1 楼 dext 的回复:
线程 修改变量 不同步?建议恶补 多线程编程

谢谢各位的回复。
目前涉及变量就一个,而且我在涉及线程内都做了互斥量锁定。
我的意图是定时器里做“读数据"处理,另外新开线程里做”数据处理“,所以我在定时器里对变量num+1,在新线程里作一直判断num是否大于0,如果大于0,则num-1。从qDebug()显示num数值上来看,num都能回0,但就是定时器定时处理时间不准了。
估计跟2楼兄弟说的一样,是CPU调度的问题。
我现在的目的就想要保证定时器定时“读数据”前提下,新线程内能够及时对新数据进行处理。不知道是不是我现在这种总的处理方式有问题。, 厉害,又长见识了,, 建议重新看下多线程, 有啊,这时候你用固定的时间肯定不行啊,这时候应该用条件变量来控制的。]