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