在回調函數裏不能使用domodal

http://topic.csdn.net/t/20051117/17/4400541.html

 

多媒體定時器和回調函數的問題,急!!

樓主jiangerlai(二來)2005-11-17 17:00:33 在 VC/MFC / 基礎類 提問

寫了一個程序,要求定時精確到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

src="/Include/Board.htm?Tags=" frameborder="0" scrolling="no">

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模式對話框改成了控制非模式對話框的顯示和隱藏。現在已經基本上達到我的要求了。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章