• 8946阅读
  • 10回复

线程run函数内调用另外一个使用sleep函数,cpu占有率 [复制链接]

上一主题 下一主题
离线wczwxj
 

只看楼主 倒序阅读 楼主  发表于: 2015-07-28
线程run函数内调用另外一个内部使用sleep函数,cpu占有率大幅度增加
void SmsQueryThread::run(){    while (true)    {        QThread::msleep(1000);        if (nTimer%nSQ == 0)        {            g_SmsMgr.QuerySQ();        }    }}
QuerySQ内部使用 ::Sleep(win api) QThread::msleep() 都会造成cpu使用率增加,如何解决?
我是从mfc转过来的,mfc这种写法就不会造成cpu使用率增加
谢谢
离线liudianwu

只看该作者 1楼 发表于: 2015-07-28
哥,你写法有问题,你这样写每次循环进入都要延时1秒,肯定占CPU了,应该这样写:
  1. void SmsQueryThread::run()
  2. {
  3.     while (true) {        
  4.         if (nTimer % nSQ == 0) {
  5.             g_SmsMgr.QuerySQ();
  6.             msleep(1000);
  7.         }
  8.     }
  9. }

欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线yanwuyue

只看该作者 2楼 发表于: 2015-07-28
楼主写的没问题,你这如果nTimer % nSQ一直不等于0的就相当于while(true){},有些环境可能会认为死循环,程序会崩溃的,
再说msleep的功能是放弃线程CPU时间片,也就是说你写msleep地方是意味着这个线程已经罢工了,
所以怎么可能会提高CPU呢,
我估计是写法有问题,楼主改成这样试试
this->thread()->msleep(1000);
或者
this->thread()->sleep(1);


this->thread()意识就是获取当前线程,反正我没这么用过QThread::msleep

离线wczwxj

只看该作者 3楼 发表于: 2015-07-28
如果 this->thread()->msleep(1000);  就只能用run()函数下函数,因为msleep是保护成员函数

大家没理解我的意思, 就是在run函数下面随意 msleep, cpu占有率不高,

但是run里面调用的子函数里面有 QThread::msleep()等 函数,cpu 马上涨
离线wczwxj

只看该作者 4楼 发表于: 2015-07-28
谢谢大家帮忙, 我找到原因了,我这样的代码逻辑是没问题的, 在g_SmsMgr.QuerySQ();
只不过 内部的延迟函数我使用了 qt的写法 g_SmsMgr.QuerySQ();QCoreApplication::processEvents(QEventLoop::AllEvents, 50); 这东西是占cpu的,我使用了::Sleep()  api函数 就不会了


用了多年的mfc 想转qt  越来越发现 作为window程序员的我,只用qt写界面就足够了,其他用api 呵呵
离线z55716368

只看该作者 5楼 发表于: 2015-07-28
我有个问题是关于定时器的。我现在使用了2个定时器控制2个灯的闪烁,都是start(1000).但是其中一个灯是一开始就闪烁,而另一个是收到命令才闪烁,有时候会出现1亮,2熄灭;然后1熄灭,2亮。这样看着不好看,有什么办法就是让2开始闪烁时跟着1的节奏呢、、、
而且 还不止一个2,还有其他的灯 都是跟1 2毫不相关的。但是想要一起闪烁这种效果
每一个问题 都是一次进步
离线yanwuyue

只看该作者 6楼 发表于: 2015-07-29
回 wczwxj 的帖子
wczwxj:谢谢大家帮忙, 我找到原因了,我这样的代码逻辑是没问题的, 在g_SmsMgr.QuerySQ();
只不过 内部的延迟函数我使用了 qt的写法 g_SmsMgr.QuerySQ();QCoreApplication::processEvents(QEventLoop::AllEvents, 50); 这东西是占cpu的,我使用了::Sleep()  api函数 就不会了 .. (2015-07-28 13:46) 

1.this->thread()->msleep(1000);在任何地方都可以调用, this->thread()会获取到当函数说在线程
2.QCoreApplication::processEvents是处理事件,肯定会占CPU
离线yanwuyue

只看该作者 7楼 发表于: 2015-07-29
回 z55716368 的帖子
z55716368:我有个问题是关于定时器的。我现在使用了2个定时器控制2个灯的闪烁,都是start(1000).但是其中一个灯是一开始就闪烁,而另一个是收到命令才闪烁,有时候会出现1亮,2熄灭;然后1熄灭,2亮。这样看着不好看,有什么办法就是让2开始闪烁时跟着1的节奏呢、、、[表情]
而且 还不止一 .. (2015-07-28 13:56) 

定时器和msleep一样也是不准的,start(1000)不会严格1秒醒过来,建议换个思路,
用一个QList<bool>保存所有灯的状态,只开一个定时器,根据QList<bool>信息一起刷新,
这样还省CPU
离线z55716368

只看该作者 8楼 发表于: 2015-07-29
回 yanwuyue 的帖子
yanwuyue:定时器和msleep一样也是不准的,start(1000)不会严格1秒醒过来,建议换个思路,
用一个QList<bool>保存所有灯的状态,只开一个定时器,根据QList<bool>信息一起刷新,
这样还省CPU (2015-07-29 10:57) 

如果是全部同步闪烁这种方案挺好,然后我昨天问了一下老大,他说每个灯的功能不一样所以闪烁时间也不一样,所以我开了很多定时器,这种情况,你有什么好建议吗
每一个问题 都是一次进步
离线yanwuyue

只看该作者 9楼 发表于: 2015-07-29
回 z55716368 的帖子
z55716368:如果是全部同步闪烁这种方案挺好,然后我昨天问了一下老大,他说每个灯的功能不一样所以闪烁时间也不一样,所以我开了很多定时器,这种情况,你有什么好建议吗 (2015-07-29 11:10) 

就不能发散一下思维
比如:
QList<int> 0:常量,小于0,常暗,>0,闪烁次数或时间
先全部初始化成-1,
QList<int>  l;//设成全局变量

通过改变QList<int>的值达到目的
离线z55716368

只看该作者 10楼 发表于: 2015-07-30
回 yanwuyue 的帖子
yanwuyue:就不能发散一下思维
比如:
QList<int> 0:常量,小于0,常暗,>0,闪烁次数或时间
先全部初始化成-1,
....... (2015-07-29 11:26) 

十分感谢你的答复,很有帮助,谢谢。
每一个问题 都是一次进步
快速回复
限100 字节
 
上一个 下一个