[問題] 有關於Sleep()的替代

看板C_and_CPP作者 (watson)時間10年前 (2014/01/12 09:35), 編輯推噓11(11029)
留言40則, 13人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC 6.0 問題(Question): clock_t t1,t2; t1=clock(); for(int j=0; j<10 ; j++) { Sleep(100); t2=clock(); printf("%lf\n",(t2-(t1)/(double)(CLOCKS_PER_SEC))/1000); } system("pause") return 0; 請問Sleep()這函式 有沒有替代的函式可以用 或是甚麼其他寫法 希望最後也能夠是毫秒的印出 0.1 0.2 直到 1 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.124.249.111

01/12 10:00, , 1F
vc 6.0 =_______=
01/12 10:00, 1F

01/12 12:59, , 2F
io會太慢…(應該吧)
01/12 12:59, 2F

01/12 13:46, , 3F
我用Sleep寫過迴圈 其他功能變不能動..
01/12 13:46, 3F

01/12 13:47, , 4F
我想把Sleep換掉
01/12 13:47, 4F

01/12 13:51, , 5F
sleep會整個停住,你要另外開一個thread才對
01/12 13:51, 5F

01/12 13:59, , 6F
windows的Sleep()精度只到16ms
01/12 13:59, 6F

01/12 14:01, , 7F
簡單一點就while(t2-t1<interval){t2=clock();}
01/12 14:01, 7F

01/12 14:19, , 8F
請問什麼是interval?
01/12 14:19, 8F

01/12 14:33, , 9F
interval 就是你自己定的區間...ex.100ms
01/12 14:33, 9F

01/12 17:26, , 10F
你應該用一個初始時間當基準才對,例如t0=2000,當count超過
01/12 17:26, 10F

01/12 17:27, , 11F
2100才列印第一筆,超過2200才列印第二筆,依此類推,中間看要
01/12 17:27, 11F

01/12 17:28, , 12F
Sleep多久自己取捨.
01/12 17:28, 12F

01/12 17:31, , 13F
你目前的作法在失去精準度上會累積,例如第一次Sleep 130ms
01/12 17:31, 13F

01/12 17:32, , 14F
第二次Sleep 120ms,兩次總共花了250ms,離預期愈差愈遠.y
01/12 17:32, 14F

01/12 19:07, , 15F
windows的Sleep()精度有到16ms?
01/12 19:07, 15F

01/12 19:46, , 16F
回樓上,有時有 有時沒有 所以沒有
01/12 19:46, 16F

01/12 20:28, , 17F
精度的定義是?
01/12 20:28, 17F

01/12 20:40, , 18F
操作上的最小單位
01/12 20:40, 18F

01/12 20:59, , 19F
沒錯,所以最好分成精度Precision與準度Accuracy來討論
01/12 20:59, 19F

01/13 09:48, , 20F
createwaitablerimer
01/13 09:48, 20F

01/14 00:15, , 21F
主要是context switch的問題,不是Sleep()不準。
01/14 00:15, 21F

01/14 00:16, , 22F
用 while(GetTickCount()-T1>100) 的用法也會有此問題
01/14 00:16, 22F

01/14 00:21, , 23F
context switch會讓你無法保證剛好准的時間~
01/14 00:21, 23F

01/14 08:02, , 24F
那我該怎麼寫又不會讓CPU停住呢!? 我想不用Sleep
01/14 08:02, 24F

01/14 13:21, , 25F
Windows tick預設精確度是15.6ms,wait誤差可能到2個tick
01/14 13:21, 25F

01/14 13:22, , 26F
Windows不是RTOS,無法提供高精度的timer
01/14 13:22, 26F

01/14 13:25, , 27F
Driver可用ExSetTimerResolution()設定最高1ms的精確度
01/14 13:25, 27F

01/14 13:25, , 28F
但不建議使用。
01/14 13:25, 28F


01/14 14:37, , 30F
這sleep_for看起來實做會只把Sleep()包裝起來...
01/14 14:37, 30F

01/14 20:31, , 31F
有什麼參照是提到把Sleep()包起來嗎?
01/14 20:31, 31F

01/14 20:58, , 32F
標準並沒有要求任何準確度
01/14 20:58, 32F

01/14 20:59, , 33F
寫lib的人應該不會找自己麻煩 Sleep()已經符合標準了
01/14 20:59, 33F

01/15 00:16, , 34F
所以就是沒有憑據 只是你自己的猜測...XD
01/15 00:16, 34F

01/15 00:24, , 35F
"看起來"
01/15 00:24, 35F

01/15 00:36, , 36F
gcc在linux下底層是nanosleep() boost(win)是Sleep()
01/15 00:36, 36F

01/15 00:36, , 37F
vs2012呼叫一個沒文件的_Thrd_sleep()
01/15 00:36, 37F

01/15 00:37, , 38F
不過我不知道win os下還提供其他更準確的sleep機制
01/15 00:37, 38F

01/15 03:11, , 39F
如上述,Windows沒有高精度的timer
01/15 03:11, 39F

01/15 03:13, , 40F
如果要高精度的timestamp,可以用QueryPerformanceCounter
01/15 03:13, 40F
文章代碼(AID): #1IqV582w (C_and_CPP)