更精確的多媒體計時器類別 - TMMTimer |
|
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
Dear ALL:
有鑑於 TTimer 計時器不太準時,所以將 Windows 提供的 Multimedia Timer 包裝一下,做成BCB的類別。TTimer 在 Win XP 下最多提供到 10ms 的精確度,而多媒體計時器經過測試,1 ms 應該沒問題。
TMMTimer 類別的用法與 TTimer 完全相同,差別在於要設定解析度與指定使用者的計時器觸發事件函式而已,在範例中都有說明。
更詳細的說明,請參考 Windows SDK 與陳寬達著的"C++ Builder 深度歷險"細說計時器部分。
在包裝的過程中,摸索最久的該算是在 callback function 中該怎樣呼叫 member function。雖然想用函式指標,也找了關於 BCB 的關鍵字"__closure"的用法,但怎麼弄 compiler 就是不給過~~後來將
附加檔案:51703_TMMTimer.rar
|
i_am_jcl
一般會員 發表:3 回覆:9 積分:2 註冊:2002-04-15 發送簡訊給我 |
參考這篇文章 或許有幫助
http://www.function-pointer.org/callback.html 我把callback function TimerProc變成member function TimerProc2
不過即使是同是member function 還是會有無法呼叫OnTimer的詭異問題 錯誤訊息如下:
[C++ Error] TMMTimerUnit.cpp(108): E2231 Member TMMTimer::OnTimer cannot be used without an object 於是我保留作者您的做法 在timeSetEvent那段也是將this傳入callback function. 程式執行效果也是相同.
希望對你的問題有幫助~ 程式異動部份: < class="code">
class TMMTimer {
...
public :
static void __stdcall TimerProc2(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD_PTR dw1, DWORD_PTR dw2); ... }; void __fastcall TMMTimer::SetEnabled(bool value){
... FTImerID = timeSetEvent(FInterval,FResolution,TimerProc2,(DWORD)this,TIME_PERIODIC);
... } void __stdcall TMMTimer::TimerProc2(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{
((TMMTimer *)dwUser)->OnTimer();
}
|
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |