看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《mingcloud (逆宇)》之銘言: : 板上大大好,是這樣的 : 小弟最近寫程式時,在time control時碰到一個問題 : 想要做的事情是 : 從QUEUE中,每隔"一秒鐘整"拉出一筆資料,然後把她送出去 : 但是始終沒有辦法控制到很精準 : 想問問看我這樣的邏輯有甚麼問題 : 或者是說 我該乖乖放棄不用控制一秒鐘 而是以分鐘為單位之類的 : 以下是我的CODE : void sleep_til_round_sec() : { : struct timeval now; : gettimeofday(&now, 0); : usleep(1000000 - now.tv_usec); : } 跟據 linux 上 usleep 的 man page The usleep() function suspends execution of the calling process for (at least) usec microseconds. The sleep may be lengthened slightly by any system activity or by the time spent processing the call or by the granularity of system timers. 再跟據 nanosleep 的 man page Compared to sleep(3) and usleep(3), nanosleep() has the following advantages: it provides a higher resolution for specifying the sleep interval; POSIX.1 explicitly specifies that it does not interact with signals; and it makes the task of resuming a sleep that has been inter- rupted by a signal handler easier. 所以簡單的作法是改用 nanosleep 看誤差是否能滿足需求 (可以搭配調高該 process 的 priority) 還不行的話,可能就要針對該 OS 研究特定的方法了 : void send_func(){ : struct timeval start, end; : while(1){ : gettimeofday(&start, 0); : DeQueue(xxx); : Sendto(...); : gettimeofday(&end, 0); : if(end.tv_sec - start.tv_sec > 0){ : exit(0); : } : sleep_til_round_sec(); : } : } : 用wireshark看 發現出來的結果還是沒有辦法每個封包之間的距離是一秒 : 還是會不準 而且最奇怪的地方是居然是太快 而不是太慢 : 用wireshark看我每個封包的間隔大概是 1sec - 5 * 10E-4 秒左右 : 想請問板上大大有沒有更好的時間控制機制之類的? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.49