📄 subject_62285.htm
字号:
<p>
序号:62285 发表者:深黑色 发表日期:2003-11-25 21:42:33
<br>主题:获得消息的困惑? 十分奇怪
<br>内容:我在主框架中定义了这样一个程序段<BR>void CMainFrame::Function<BR>{<BR> if(GetMessage(&msg,this->m_hWnd,0,0)) <BR> {<BR> TranslateMessage(msg);<BR> DispatchMessage(msg);<BR> }<BR> ...<BR> ...<BR>}<BR>我在主框架中不同的地方调用它,但执行的速度很不相同,有些地方甚至卡在GetMessge()的地方。 请问这是为什么?? 这个函数就获得主框架的消息阿,怎么在不同的地方有差别? (不同的地方是指 在调用它之前,我可能进行了对话框的操作,比如说打开文件对话框等,这些对这个有没有影响?)<BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:太平冰水 回复日期:2003-11-26 12:41:51
<br>内容:当当前线程消息队列中没有消息时GetMessage就会堵塞<BR>一般这个结构用在一个漫长的循环中,因为循环中的消息被堵塞,所以用他来分派以下
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:深黑色 回复日期:2003-11-26 13:37:02
<br>内容: 我是在循环中调用这个的,如果这段时间没有消息,那循环不是要卡在那里??<BR>我在有些地方就是卡在getmessage()上了,且不能执行下去。<BR><BR> 我想在程序中,刷新视图的数据,既我在程序中改变了视图输出的数据,也要让视图输出动态的改变显示。但刷新过程要在该循环不退出的时候完成,而且在循环中又要能响应键盘输入消息;<BR>我这样做了:(但会卡住,就像上面所提的那样,原因就是上面的那样)<BR>void Refresh()<BR>{ <BR> for(int i=0; i++; i<10000)<BR> {<BR> if(GetMessage(&msg,pXXXView->m_hWnd,0,0))<BR> {<BR> TranslateMessage(msg);<BR> DispatchMessage(msg);<BR> }<BR><BR> pXXXView->Invalidate(TRUE); //刷新视图,将改变了的数据结果,显示出来<BR><BR> if(GetMessage(&msg,this->m_hWnd,0,0)) <BR> {<BR> TranslateMessage(msg);<BR> DispatchMessage(msg);<BR> }<BR> }<BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:深黑色 回复日期:2003-11-26 13:39:37
<br>内容:我也用了,PeekMessage() 来代替GetMessage() 虽然不会卡住,但也不能接受键盘消息了?<BR>请问该如何解决??
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不说 回复日期:2003-11-26 15:39:33
<br>内容:while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) <BR> { <BR> DispatchMessage(&msg); <BR> }
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:太平冰水 回复日期:2003-11-26 16:30:25
<br>内容:最好使用多线程实现你的设想
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:深黑色 回复日期:2003-11-26 17:37:53
<br>内容:while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) <BR> { <BR> DispatchMessage(&msg); <BR> } <BR>如果这样不是也会卡在那边???<BR><BR>我要求是每次循环都不能暂停,但有键盘消息时才可以暂停来处理它!<BR><BR>多线程不行的,我要求的时间太短了,要比1ms还要小,windows分给每个线程的时间片大概是20ms,不能满足我的要求的<BR>请看 我的另一个主题 :挑战VC极限,多线程的极限,时间控制的极限
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:不说 回复日期:2003-11-26 19:12:43
<br>内容:首先俺那个代码段是不会卡住的哈,其次呢,仔细看了一眼你的程序,这句<BR>pXXXView->Invalidate(TRUE); <BR>本身就是在发送消息啊,必然会引起消息循环的动作啊,你还没事dispatch什么劲啊?dispatch一般用在长时间的大循环而且里面不会有任何的空隙留给程序处理界面消失的时候(比如I/O操作什么的)。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:深黑色 回复日期:2003-11-26 22:00:43
<br>内容:你的方法在一般情况下确实没问题,我也试过了。<BR>但我的程序不知为什么还是不能刷新,我在调用刷新的时候曾经打开过模式对话框,但关闭了,我想这个应该没影响的吧?<BR>但还是谢谢 不说!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不说 回复日期:2003-11-27 00:43:39
<br>内容:不能刷新那是显示的问题应该,Invalidate会间接调用视图的OnDraw方法里的代码,你看看你的OnDraw里写对了没有先。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:深黑色 回复日期:2003-11-27 08:22:15
<br>内容:我在主框架中其他地方调用是可以的,所以不是显示里面的问题。我在那个地方调用,已开始不能刷新,但过一回就能刷了,而且刷新频率好像不对。<BR>请问在调用这个消息处理的过程,其他有什么会影响它的??
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -