请教大家一个困扰了我很久的问题啊,关于VC++中多线程中Sleep

popo20100 2011-08-04 10:41:49
现在的现象是这样的:在线程中使用while死循环,利用定时器计算这个线程中while的执行次数,待次数稳定时候结果如下
当Sleep(1)的时候计算出循环每秒执行的次数是64
当Sleep(10)的时候计算出循环每秒执行的次数是64
当Sleep(20)的时候计算出循环每秒执行的次数是32
当Sleep(30)的时候计算出循环每秒执行的次数是32
当Sleep(40)的时候计算出循环每秒执行的次数是21
当Sleep(50)的时候计算出循环每秒执行的次数是16
当Sleep(60)的时候计算出循环每秒执行的次数是15、16
当Sleep(70)的时候计算出循环每秒执行的次数是12,13
当Sleep(80)的时候计算出循环每秒执行的次数是10,11
当Sleep(90)的时候计算出循环每秒执行的次数是9,10
当Sleep(100)的时候计算出循环每秒执行的次数是9

第一、为什么会有这样的结果?
第二、我想知道有没有办法提高循环每秒执行的次数,而且最好不要占用较高的CPU?
第三、当我在循环之内加入一个for循环68次执行Sleep(1), 那么每秒执行的次数是1,为什么?
...全文
394 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxq123321 2011-08-05
  • 打赏
  • 举报
回复
那你还不如settimer了
quwei197874 2011-08-05
  • 打赏
  • 举报
回复
windows不是事实函数,Sleep(100)一下不准的
popo20100 2011-08-05
  • 打赏
  • 举报
回复
有没有更好的办法啊 我要在一个线程里面循环发送图像帧,每个图像帧有50k左右,题目要求UDP通信,我每次发送1024个字节之后Sleep一下来减少丢包率,这样下来每秒才可以发送一个图像帧,我还尝试了获取时钟频率使用while循环检测来精确定时,这样图像帧发送的频率是提高了,但是CPU使用率是100%
Twicer 2011-08-05
  • 打赏
  • 举报
回复
多媒体定时器正解
popo20100 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lijianli9 的回复:]
QueryPerformanceFrequency+QueryPerformanceCounter可以实现,如果CPU出现使用过高,就是你的设计思路代码有问题了。
[/Quote]

能说下设计思路吗 这个确实可以就是可以实现 但是由于我使用的while循环判断时间间隔的 cpu使用率高达95%以上了
一桶姜山 2011-08-05
  • 打赏
  • 举报
回复
用sleep来减少丢包率这个设计本身就不妥吧
zzw820626 2011-08-05
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20051117/16/4400329.html
zzw820626 2011-08-05
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100201/17/0790ab14-d48f-4325-8ebf-b5f5e88a9589.html
acaiacc 2011-08-05
  • 打赏
  • 举报
回复
多媒体定时器
辰岡墨竹 2011-08-05
  • 打赏
  • 举报
回复
不要Sleep放弃CPU,因为Windows里线程上下文切换时很耗费CPU时间的。
请用Timer。
Lactoferrin 2011-08-05
  • 打赏
  • 举报
回复
timeBeginPeriod 可以修改Sleep的精度
nnull 2011-08-05
  • 打赏
  • 举报
回复
每次进入do 判断时间是否够10秒 不久行了. 你要爬判断的占用cpu时间,你就再来一次循环计算判断时间的时间,两次相减不就准了 吼吼

==============
写着完的, 我好像看见lz的另外一个帖子问这个问题了

jiyuhai1988 2011-08-05
  • 打赏
  • 举报
回复
sleep是毫秒级别的
lijianli9 2011-08-05
  • 打赏
  • 举报
回复
QueryPerformanceFrequency+QueryPerformanceCounter可以实现,如果CPU出现使用过高,就是你的设计思路代码有问题了。
oyljerry 2011-08-04
  • 打赏
  • 举报
回复
Sleep只是让出CPU,由系统来调度,而且它有自己的精度,以及取决于OS的调度,所以不会是那么精确,你需要更精确地定时器等
redui 2011-08-04
  • 打赏
  • 举报
回复
首先SLEEP时,精度只有10毫秒,低于此值是无效的
其次线程并非按时被唤醒,这要看时间片的分配
再次,已经SLEEP的线程可能并非真的在睡觉,如果存在可等待时钟(梦中美女),那么睡觉时间被用来激活可等待的任务(跟美女梦中约会),如果约会还没结束,梦也不会醒

不管怎么说,windows不是实时系统,统计每秒循环次数不可能准确

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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