在回调函数里不能使用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模式对话框改成了控制非模式对话框的显示和隐藏。现在已经基本上达到我的要求了。 

你可能感兴趣的:(工作中遇到的问题)