C_and_CPP 板


LINE

不建議採用迴圈一直檢查時間到了沒,不但不準而且相當浪費系統資源。 既然你都已經把時距算出來了,那就好辦,小弟提供幾種解法。 1.單純的讓它sleep(時距),再做事,但重點在於你的sleep要能夠精確到milli甚至micro 但是正常情況下,Windows的sleep並不能做到這麼準,你可以參考黑暗執行緒的說明 http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/03/29/673.aspx 但是這種做法不能跨平台,你可以考慮用select()來做,網路上很多範例 { struct timeval tval; tval.tv_sec = 0; tval.tv_usec = 10; select(0,NULL,NULL,NULL,&tval); } 2.更進階的操作,你可以參考boost asio裡的timer,還可以分為async及sync兩種用法 應該是最優雅的寫法,但殺雞要不要用牛刀就看你自己了 http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/tutorial.html 如果你的音樂會mix多軌在做播放,用sleep/select的方式會需要比較多threads,但如 果採用asynchronous的方式,可以一個thread就能解決,但相對也比較複雜。 不過,要精準播放audio不是一件那麼容易的事情,就算你能夠擁有一個很準的timer,在 系統層/硬體層都還有許多難關要克服,才能處理的很漂亮。 不過一般的小軟體應該不會碰到這些問題就是了。 ※ 引述《crazytea (............)》之銘言: : 其實前面的碼表問題本來是希望能夠自己解決, : 沒想到問的詞不達意還無法解決問題 囧 : 所以就直接問了! : 音樂遊戲一定要藉由精準的時間判定來播放botton : 該在幾秒案就該在幾秒按 : 雖然拍子跟秒數之間有公式可以算(bpm) : 例如:150 bpm (即 1 分鐘 150拍 ) : 但是算到後來一拍的時間也是幾百 ms : 要如何計算從音樂開始播放後 : 每隔固定時間(拍子)播放botton : 是我現在的瓶頸~~ : 我有下載跳舞機模擬器( stepMania ) 的原始碼來看, : 但是由於程式過於龐大, : 目前只針對timeGetTime()尋找整個專案 : 找到相關程式碼如下: : static bool g_bTimerInitialized; : static DWORD g_iStartTime; : static void InitTimer() : { : if( g_bTimerInitialized ) : return; : g_bTimerInitialized = true; : timeBeginPeriod( 1 ); : g_iStartTime = timeGetTime(); : } : int64_t ArchHooks::GetMicrosecondsSinceStart( bool bAccurate ) : { : if( !g_bTimerInitialized ) : InitTimer(); : int64_t ret = (timeGetTime() - g_iStartTime) * int64_t(1000); : if( bAccurate ) : { : ret = FixupTimeIfLooped( ret ); : ret = FixupTimeIfBackwards( ret ); : } : return ret; : } : uint64_t ArchHooks::FixupTimeIfLooped( uint64_t usecs ) : { : static uint64_t last = 0; : static uint64_t offset_us = 0; : /* The time has wrapped if the last time was very high and the current time is : very low. */ : const uint64_t i32BitMaxMs = uint64_t(1) << 32; : const uint64_t i32BitMaxUs = i32BitMaxMs*1000; : const uint64_t one_day = uint64_t(24*60*60)*1000000; : if( last > (i32BitMaxUs-one_day) && usecs < one_day ) : offset_us += i32BitMaxUs; : last = usecs; : return usecs + offset_us; : } : uint64_t ArchHooks::FixupTimeIfBackwards( uint64_t usecs ) : { : static uint64_t last = 0; : static uint64_t offset_us = 0; : if( usecs < last ) : { : /* The time has moved backwards. Increase the offset by the amount we moved. : */ : offset_us += last - usecs; : } : last = usecs; : return usecs + offset_us; : } : 還是搞不懂他在幹啥? : 或是有更好的方法嗎? --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.43.78.61
1F:推 crazytea:感謝 我試試看..... 04/26 22:10







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP