http://topic.csdn.net/t/20051117/17/4400541.html
多媒體定時器和回調函數的問題,急!!
寫了一個程序,要求定時精確到ms,所以選擇了多媒體定時器。打算定時彈出窗口,但是自定義的窗口類在回調函數中無法使用,又不想通過消息傳遞實現,因爲消息傳遞需要時間也會增加誤差,各位有什麼方法?急等!!!
//設置定時器代碼如下
TimerID_1ms = timeSetEvent(m_iDuration, m_iwAccuracy,
LPTIMECALLBACK) OneMilliSecondProc,
(DWORD)this,TIME_ONESHOT);
//回調函數代碼如下
void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{
CDlgSelect dlgSelect;
if(dlgSelect.DoModal()==IDOK)
{
//省略
}
} 問題點數:100、回覆次數:19Top
1 樓Mackz(在相互)回覆於 2005-11-17 18:10:20 得分 0
“但是自定義的窗口類在回調函數中無法使用”
++++++++++++++++
怎麼個不能用法?是不是沒有包含頭文件?Top
2 樓rageliu(天氣好了就去長白山看水怪去了,嘿嘿...)回覆於 2005-11-17 18:53:37 得分 5
CDlgSelect dlgSelect;
if(dlgSelect.DoModal()==IDOK)
{
//省略
}
這裏不能使用???Top
3 樓jiangerlai(二來)回覆於 2005-11-17 20:15:07 得分 0
對,類的hWnd爲0x00000000。無效。domodal的時候出錯Top
4 樓jiangerlai(二來)回覆於 2005-11-17 21:52:12 得分 0
順便問下,windows程序從發出消息到消息被處理大概需要多少時間?Top
5 樓DentistryDoctor(不在無聊中無奈,就在沉默中變態)回覆於 2005-11-17 22:08:41 得分 0
用消息即可,如果系統不忙,發送消息到被處理的時間響應可以忽略。Top
6 樓Winner25(幫忙關注一下www.jjlsoft.com/elong)回覆於 2005-11-17 22:49:45 得分 50
timeSetEvent,是別的線程上下文,而且文檔明確告你了不能調用這些函數,你還更來個domodal堵塞,哈哈Top
7 樓jiangerlai(二來)回覆於 2005-11-18 08:57:48 得分 0
有沒有辦法可以繞過這個限制,我用的是TIME_ONESHOT,只執行一次,所以彈出窗口不會影響引起堵塞。問題就是如何在它的線程上下文中使用我的窗口???Top
8 樓Winner25(幫忙關注一下www.jjlsoft.com/elong)回覆於 2005-11-18 12:05:23 得分 0
暈,我說的堵塞是指你堵塞timesetevent中所指定的回調函數的線程,你就不能在這個函數裏做這些事,除了PostMessage, timeGetSystemTime, timeGetTime, timeSetEvent, timeKillEvent, midiOutShortMsg, midiOutLongMsg, and OutputDebugString.
而且我覺得你這個解決方案裏有個矛盾:
1。顯示窗口中間也要處理消息來創建和顯示
2。你人的反映是非實時的,爲什麼非要在精確的時間裏來給你通過顯示來提示呢?
3。你完全可以在timesetevent裏做控制,後發消息來控制窗口創建Top
9 樓jiangerlai(二來)回覆於 2005-11-24 12:48:40 得分 0
我是要用來做實驗,測與人相關的數據,所以要求定時儘量準確。我現在用在回調函數裏發消息的方法顯示窗口,程序剛開始運行的時候還好,定時很準確,100ms和50ms差別很大,但程序運行了一段時間後就變得誤差很大,定時100ms和50ms沒什麼差別。我已經在程序中把程序的優先級設成最高的了。
Winner25和其他高手能告訴我是可能是什麼原因造成的麼?給點建議,急啊!!Top
10 樓jiangerlai(二來)回覆於 2005-11-24 13:42:44 得分 0
程序的流程是這樣的:
處理
——顯示問題,設置定時器(ONE_SHOT)
——回調函數中取消定時器,發送消息
——消息處理函數中彈出窗口接收用戶輸入
——下一次處理
——顯示問題,設置定時器
。。。。依此循環Top
11 樓jiangerlai(二來)回覆於 2005-11-24 15:43:17 得分 0
好像從發出消息到彈出窗口之間的時間隨程序運行越來越長了。大家有什麼好的建議麼?Top
12 樓oyljerry(【勇敢的心】→ ㊣提拉米蘇√㊣)回覆於 2005-11-24 17:12:54 得分 25
可能消息處理有了延時
系統負荷是不是比較大Top
13 樓jiangerlai(二來)回覆於 2005-11-24 21:16:06 得分 0
是的,我把程序優先級設爲最高,通過任務管理器察看,程序開始時,在彈出對話框之前機器cpu使用率20%左右,程序佔用內存15兆左右。隨程序的運行,程序變得越來越慢,在彈出對話框之前cpu利用率上升到30%到40%。佔用內存減少到10兆一下。當程序關閉時,機器硬盤有聲音,好像是在從虛擬內存讀數據。
有什麼方法解決這個程序運行越來越慢的問題麼?拜託Top
14 樓Stefine(CSDN最菜滴猩猩)回覆於 2005-11-24 21:41:02 得分 0
不會是有內存泄漏吧
一些簡單的堆內存沒有釋放的問題,
這麼東東應該早注意到了吧
Top
15 樓jiangerlai(二來)回覆於 2005-11-24 22:16:43 得分 0
不是,如果那樣,程序佔用的內存應該增加。而且程序運行或者結束時通常會出錯。Top
16 樓stars_0913()回覆於 2005-11-25 00:18:21 得分 20
總體上,windows不是一個實時系統,你的ms級要求很本無法滿足.
除非機器超級快並且只有你的應用程序運行,纔可以用消息隊列,否則只能寫一個驅動程序,通過pc精確的時鐘中斷請求回調你的處理函數.呵呵,後一個方案好難的.
Top
17 樓jiangerlai(二來)回覆於 2005-11-25 09:07:47 得分 0
謝謝各位的回答。我的程序允許有一定的誤差。現在沒有時間研究驅動程序。只想能不能儘量把定時做的準確。現在程序剛開始運行的時候能夠達到我的要求,執行一段時間以後就達不到了,我的程序的每一個循環都要佔用和釋放內存來處理圖片,可以肯定每一次使用內存之後都釋放了。是不是這樣做造成的程序越來越慢呢?有什麼解決方法?Top
18 樓Winner25(幫忙關注一下www.jjlsoft.com/elong)回覆於 2005-11-25 22:47:19 得分 0
樓主,不知道你是做什麼實驗,你需要的這種實行環境能給說一下嗎?否則不好回答!
1。程序變慢,可能是你要處理的數據 隨時間 增加,也可能是memory leak
2。其實你可以這樣做,如果要保存數據,你可以在main program 啓動是分配一大塊memory 做緩衝,可以利用一些高效的結構與算法來存取
3。顯示可以按照一定的時間規律來處理,比如1s 更新一下,這樣能平衡一下負載
4。在你的多媒體定時器裏只做與實行處理相關的操作(充分必要的動作)
5。定好用一些rtos來做這種要求很高的實驗
6。最期望的還是樓主能夠把你現在的實驗與環境說清楚一下
最後問一下,樓主學什麼的呢?在哪兒上學?Top
19 樓jiangerlai(二來)回覆於 2005-11-27 21:50:17 得分 0
謝謝各位的回答,問題已經基本解決了。
我改用了 QueryPerformanceFrequency和 QueryPerformanceCounter,去掉了消息機制通過循環定時。另外,我將頻繁domodal模式對話框改成了控制非模式對話框的顯示和隱藏。現在已經基本上達到我的要求了。