OnTime消息

id="Topic_Zone" marginwidth="0" marginheight="0" src="/u/AD/Topic_Zone.aspx" frameborder="0" width="100%" scrolling="no" height="0">
发表于:2007-06-22 12:39:541楼 得分:0
f()函数一定会进入多次
 
  • sangwf
  • 等 级:
发表于:2007-06-22 12:51:572楼 得分:0
那就比较奇怪了,为什么会进入多次呢。既然主程序是单线程的,同时只能有一个地方在执行,而弹出对话框会令程序阻塞到那里,其他的函数执行不进去才对。

另外,我刚做了测试,在弹出多个对话框时,线程数并没有增加,说明ontimer肯定不是通过多线程机制实现,这是怎么一回事呢?
 
发表于:2007-06-22 12:57:283楼 得分:0
应该是异步或消息通知机制吧,windows里面全部都是消息
 
  • appleboyecho
  • 等 级:
发表于:2007-06-22 12:58:124楼 得分:0
WINDOWS在定时时间到后,会把WM_TIIMER消息放入应用程序的消息队列当中,不管你的对话框是否关闭,也不管你执行什么,因此,F函数肯定会进入多次的。
 
  • khler
  • 等 级:
发表于:2007-06-22 13:03:095楼 得分:0
谁说的主程序是单线程的?GUI程序都是CWinApp的一个实例,而CWinApp就是继承自CWinThread
 
  • sangwf
  • 等 级:
发表于:2007-06-22 13:05:326楼 得分:0
你是说主程序是多线程的?就是我的对话框不关闭,照样会处理消息队列中的消息?

如果是这样,f()会不会同时有多个在执行?那岂不等于是多线程?
 
发表于:2007-06-22 13:07:307楼 得分:0
在函数执行某处弹出一个模态对话框!
可以说只是把这个函数后面的代码暂停执行!等待这个模态对话框关闭,然后恢复执行!
不是把当前线程挂起!

如果f()函数执行的时间很长,超过了定时器的周期,那会不会出现f()函数被进入多次呢!

当然会被多次进入!只不过下一次ontimer得在前一次的ontimer中的f()执行完后被调用!


 
  • sangwf
  • 等 级:
发表于:2007-06-22 13:20:198楼 得分:0
那就是说模态对话框弹出以后,程序还可以继续处理其他消息?

另外,如果我不弹出对话框,而是执行f()函数,那是不是会出现两个f()函数都执行了一半?也就是出现同步问题?
 
  • sangwf
  • 等 级:
发表于:2007-06-22 13:22:549楼 得分:0
另外一个问题就是,主程序在进行消息处理时,肯定是要等待一个消息处理完之后再处理下一条消息的吧?而弹出对话框之后说明当前的消息还没有处理完啊,怎么会执行下一条呢?
 
发表于:2007-06-22 14:01:2810楼 得分:0
那是不是会出现两个f()函数都执行了一半?
---------------------------------------
是的!

而弹出对话框之后说明当前的消息还没有处理完啊,怎么会执行下一条呢?
----------------------------------------------------------------
我的理解是就当弹出摸态对话框的时候会做些特殊处理了!
 
发表于:2007-06-22 14:04:3411楼 得分:0
具体是怎么处理我就不知道!
毕竟程序是人家微软写的!
呵呵!

ps:别忘了结贴^_^
 
发表于:2007-06-22 14:18:0012楼 得分:0
楼上说的全不对!听我的:
1首先程序本身是单线程,这一点错误也没有!
2至于会连续弹出对话框,是因为虽然对话框会将线程的消息派发阻塞,但是对话框(包括messagebox)也会有一个无限循环,用于getmessage(),dispatchmessage(),所以永远不会阻碍主先程获得,分派消息!
就是这样,希望大家多重视一些基础的windows原理机制,毕竟原理是很重要的。
 
  • sangwf
  • 等 级:
发表于:2007-06-22 14:34:5913楼 得分:0
2,如果主线程的派发阻塞了,就没办法发出ontimer消息了,又怎么会弹出新对话框呢?

另外,f()会出现多个同时在执行么?
 
发表于:2007-06-22 14:50:3214楼 得分:0
至于会连续弹出对话框,是因为虽然对话框会将线程的消息派发阻塞
----------------------------------------------------------------------------
无语。。。。
呵呵!
 
  • sangwf
  • 等 级:
发表于:2007-06-22 14:59:1315楼 得分:0
是不是没有表达清楚,解释不通啊。
 
发表于:2007-06-22 15:01:3816楼 得分:0
定时消息是操作系统往线程队列里打的消息,不是你线程给自己往消息队列里发送的,就像鼠标消息一样,你有见过什么时候线程阻塞得连鼠标消息都接收不了了么?  
     
      还有楼上的zhejiang9(Why   not?),你觉得我哪里说错了么?你最好自己做程序试验一下,要是我错了欢迎你提出来。  

 
发表于:2007-06-22 15:05:5717楼 得分:0
我给你解释下吧!
按照cymvp()   这位老兄的说法是:
如果你在程序里弹出了100个模态对话框!
这个线程就会有101个消息循环;
。。。。想想都假!
 
发表于:2007-06-22 15:09:2418楼 得分:0
sangwf,你用vc的win32   application建立一个工程,然后在:


while   (GetMessage(&msg,   NULL,   0,   0))  
{
                                  ******
if(msg.message==WM_try {
MessageBox(hWnd1, "主窗口发送WM_try ", " ",0);

}
**************
if   (!TranslateAccelerator(msg.hwnd,   hAccelTable,   &msg))  
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

加上*****的那段语句,其中WM_try是我自定义的消息,你可以添加一下,然后在窗口函数中随便哪个case下发送这个消息,比如:


case   IDM_ABOUT:
if(hWnd==hWnd1)
{

PostMessage(hWnd1,WM_try,0,0);///将消息放入队列就返回;
//Sleep(3000);
DialogBox(hInst,   (LPCTSTR)IDD_ABOUTBOX,   hWnd,   (DLGPROC)About);

}

然后你就会发现,Wm_try消息仍会接受,但是不会出来“主窗口发送WM_try“的对话框,因为Wm_try消息是messagebox帮你接受的!
 
发表于:2007-06-22 15:14:5219楼 得分:0
zhejiang9(Why   not?)   请问你做试验了么?你真的懂这里的消息循环么?  

你要是不明白我给你讲!这里只有一个线程,当然只有一个消息循环,只是当你弹出对话框的时候,对话框阻塞了主线程的消息循环,而接替过来了消息循环,因为它的内部也是一个无限的消息接收,派发机制。而你再弹出另一个对话框b的时候,对话框b又会接替过来消息循环,而把第一个对话框阻塞掉。这也是你为什么弹出第2个对话框后第一个对话框变得点击无效了的原因。
 
发表于:2007-06-22 15:16:5220楼 得分:0
。。。。。。
你这是在阻塞线程主消息循环!
你把他都阻塞了!
你怎么处理messagebox产生的停留在线程消息队列中的消息
比如WM_PAINT等!
你画都画不了!去哪显示去!
 
发表于:2007-06-22 15:18:5521楼 得分:0
呵呵!
程序我写很多了!
试验就不用了!

ps:写了这么久的VC程序了,我没你想象的那么面!哈哈!
 
发表于:2007-06-22 15:21:0322楼 得分:0
zhejiang9(Why   not?)   ,请问你做试验了么?做了实验再回来说!
线程主消息循环里的那段messagebox代码根本就不会执行!因为主线程的消息循环里根本接受不到wm_try的消息!
作计算机怎么能不动手阿!
 
发表于:2007-06-22 15:22:1523楼 得分:0
哈哈!
我写过这方面的程序!
要不我能随便乱讲嘛!
 
发表于:2007-06-22 15:25:3224楼 得分:0
呵呵我也没别的意思,但是vc把上面的东西都封装好了,这块东西基本是用不到的。
关于对话框的消息循环网上的资料很多,可以去看看,我说的基本是没有问题的,要是有什么问题,可以继续讨论。
 
发表于:2007-06-22 15:26:1325楼 得分:0
从上面看下来一把汗阿,总算cymvp()说出正确答案来了。
DoModal和MessageBox的自身代码里面有消息循环(负责消息取出和处理),当一个MessageBox还存在的时候,CPU还在处理MessageBox内部的代码,当你有任何消息的时候到来,MessageBox内部的代码会负责将之处理掉。
给你一个简单的例子

CxxxDlg::OnTimer(UINT   nIDEvent)
{
static   int   i   =   0,j;
j   =   i++;
if   (i==2)   KillTimer(nIDEvent);
MessageBox( "! ");
i++;
CString   str;
str.Format( "%d,%d/r/n ",j,i);
::OutputDebugString(str);
}

知道结果是什么?调试一下,看看输出框结果,想想为什么会是这样,很容易理解的。
 
发表于:2007-06-22 15:27:5826楼 得分:0
谢谢楼上的朋友,真想顶你一下!
 
发表于:2007-06-22 15:28:4727楼 得分:0
CxxxDlg::OnTimer(UINT   nIDEvent)
{
static   int   i   =   0;
int   j;
j   =   i++;
if   (i==2)   KillTimer(nIDEvent);
MessageBox( "! ");
i++;
CString   str;
str.Format( "%d,%d/r/n ",j,i);
::OutputDebugString(str);
}

错了,第二个j不是static的。
 
发表于:2007-06-22 15:34:1728楼 得分:0
~—~
好象是我错了!
cymvp()     sorry,sorry
学习学习!
对楼主误导表示歉意!
 
发表于:2007-06-22 15:39:1729楼 得分:0
客气,交流没有对错哈
 
发表于:2007-06-22 15:43:2530楼 得分:0
上面好像还有一点没有指明,f()不可能同时执行,必须在上一次f()执行完后才可能执行下次,除非你的f()里面也处理了消息循环,处理消息循环大致的代码如下:
while   (GetMessage(&msg,   NULL,   0,   0))  
{
if   (!TranslateAccelerator(msg.hwnd,   hAccelTable,   &msg))  
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

基本上就是cymvp()   举的例子。
当初我初学时也被这个问题困扰了很久……
 
发表于:2007-06-22 15:44:5431楼 得分:0
呵呵!
没白争论这么久!
虽然自己错了也很爽!
哈哈!
继续努力!

 
  • sangwf
  • 等 级:
发表于:2007-06-22 15:45:5632楼 得分:0
谢谢cymvp,虽然没有弹出MessageBox(hWnd1, "主窗口发送WM_try ", " ",0);,但我怎么能判断出时AboutBox处理的呢?
 
发表于:2007-06-22 15:49:2833楼 得分:0
cymvp()   (   )   信誉:100         Blog       加为好友     2007-06-22   15:14:52     得分:   0    

      zhejiang9(Why   not?)   请问你做试验了么?你真的懂这里的消息循环么?  

你要是不明白我给你讲!这里只有一个线程,当然只有一个消息循环,只是当你弹出对话框的时候,对话框阻塞了主线程的消息循环,而接替过来了消息循环,因为它的内部也是一个无限的消息接收,派发机制。而你再弹出另一个对话框b的时候,对话框b又会接替过来消息循环,而把第一个对话框阻塞掉。这也是你为什么弹出第2个对话框后第一个对话框变得点击无效了的原因。
-------------------------------------------------------------------------------

最后一句有问题,“第一个对话框变得点击无效”是因为DoModal将第一个对话框EnableWindow(FALSE)的缘故,如果你在第二个对话框弄个按钮,点一下将第一个对话框EnableWindow(TRUE)的话,第一个对话框依然是完全正常的。
DoModal和MessageBox以及上面自己手动加的消息循环代码都是一视同仁的,不会只为自身服务……

   
 
 
  • sangwf
  • 等 级:
发表于:2007-06-22 15:50:2434楼 得分:0
回的慢了,你们都讨论了这么多。。
 
发表于:2007-06-22 15:54:2935楼 得分:0
w_anthony()  
我也想顶你下!
对了!
我怎么找这方面的资料都找不着呢!
有什么好书介绍下!
 
发表于:2007-06-22 15:55:4736楼 得分:0
关于f()能不能执行多次的问题,我倒是觉得可以执行多次,因为我认为窗口函数就是可以同时调用的,比如在:
case   IDM_ABOUT:
if(hWnd==hWnd1)
{

SendMessage(hWnd1,WM_try,0,0);///将消息放入队列就返回;
....

用SendMessage()发给线程一个消息,当前的窗口函数就会被阻塞住(因为SendMessage()必须等待消息处理返回,而dispatch()又必须等待窗口函数返回),但是SendMessage()发送的WM_try消息会立即被处理,因为另一个窗口函数同时被调用了。
而且如果f()不能同时执行多次,那么怎么会跳出多个messagebox对话框呢?

这是我的理解,希望w_anthony()   和其他高手能指教改正!
 
发表于:2007-06-22 15:59:0237楼 得分:0
我不是书上找出来的,根据实践推测出来的,比如我上面提的那个例子,运行一遍,等两次MessageBox出来后,随便先点哪个的确定都可以,马上就能看出代码运行的顺序,结果是
2,3
1,4
这说明了什么,一般人自己都能推测出来了
 
发表于:2007-06-22 16:03:4138楼 得分:0
"第一个对话框变得点击无效”是因为DoModal将第一个对话框EnableWindow(FALSE) "这个说法我一直也这么认为,但是一直没有想到怎么验证,幸而这里得到你的确认!

还有一个问题就是我刚才说的“再弹出另一个对话框b的时候,对话框b又会接替过来消息循环,而把第一个对话框阻塞掉。”,可能有错误,因为第2个弹出对话框b不会使第一个弹出对话框无效,而是使MessageBox()的第一个参数句柄所关联的对话框无效。
 
发表于:2007-06-22 16:07:5339楼 得分:0
To:搂主sangwf(★小三★)   (   )

你在楼上提的“虽然没有弹出MessageBox(hWnd1, "主窗口发送WM_try ", " ",0);,但我怎么能判断出时AboutBox处理的呢?”我暂时也还没有想出来怎么明确证明是AboutBox处理的,毕竟AboutBox是系统封装好的,无法像主线程那样修改它的派发消息循环,但大概可以接受这么个事实,我再想想
 
发表于:2007-06-22 16:10:2740楼 得分:0
楼上二位!
进这贴留个言!
http://community.csdn.net/Expert/topic/5615/5615649.xml?temp=.9416773
 
发表于:2007-06-22 16:12:3741楼 得分:0
进去拿分!
我也学到了这方面的知识!
所以散点分给二位!
呵呵!
 
发表于:2007-06-22 16:18:4442楼 得分:0
程序果然是调出来的,我刚才试了一下,我举的例子有个弱智BUG,应该是j   =   ++i,而不是j   =   i++,不然结果就是
1,3
0,4

至于cymvp()上面举的窗口函数当然是可以被多次调用的,窗口函数是回调函数,他是被消息循环调用的,消息循环本身所在的函数是可能被多次调用的,那它调用的回调函数当然也可以被多次调用了,这不是废话么。

另外上面你说的阻塞应该是指代码的阻塞,窗口的消息正常响应,不会有卡死的现象的……
 
  • sangwf
  • 等 级:
发表于:2007-06-22 16:20:4343楼 得分:0
我刚做了测试,确实是弹出的对话框会接收到父窗口的消息。但问题是,子窗口本身的消息循环并不会处理该消息,应该是传递给了父窗口。也就是父窗口一定会收到该消息。而父窗口正在忙于处理弹出的第一个对话框,怎么会处理接下来的消息呢?
 
发表于:2007-06-22 16:22:2744楼 得分:0
那怎么解释在OnTimer()里面MessageB0x()可以同时跳出来多次呢?不是OnTimer()被同时执行了多次么?
 
发表于:2007-06-22 16:29:0145楼 得分:0
To:w_anthony()   :  
OK,现在咱们关于窗口函数可以被同时(是同时,也就是可以在同一时刻存在多个函数的副本)调用多次的问题已经达成一致,但是“消息循环本身所在的函数“你指的是dispatchMessage()么?如果是,那么我要说:主线程的dispatchMessage()只能同时执行一次!

”指代码的阻塞,窗口的消息正常响应“消息正常响应咱们也能达成一致,因为消息响应可以通过对话框的消息循环进行处理;而“代码的阻塞”我不知道具体指什么,因为窗口本身是没有代码的。
 
  • sangwf
  • 等 级:
发表于:2007-06-22 16:30:0046楼 得分:0
这个问题还是需要确认一下,对于MFC的消息处理机制,是不是消息队列中的一条消息执行完之后才能执行下一条?
 
发表于:2007-06-22 16:34:4347楼 得分:0
To:sangwf(★小三★)  

"而父窗口正在忙于处理弹出的第一个对话框,怎么会处理接下来的消息呢? "你要知道,窗口是不会处理消息的,处理消息的任务是交给窗口函数的,所以只要消息分发循环不会阻塞,那么消息就都会被正常响应。

 
  • sangwf
  • 等 级:
发表于:2007-06-22 16:35:0748楼 得分:0
汇报一下刚才我测试的结果,我将主程序的定时器设为10秒,当第一个时刻到来时,子窗口会不断的收到父窗口的WM_TIMER消息,这些消息的时间又是不断加上去的。这是怎么一回事呢?凭我的理解也该是10秒钟收到一个的。
 
发表于:2007-06-22 16:42:1949楼 得分:0
To   sangwf(★小三★)   :
这么说吧父窗口的消息循环所在函数设为A,弹出的子窗口内部的消息循环部分设为B
首先程序一直在A处执行循环,弹出子窗口后,程序在B处处于循环状态,这时B处收到一个给父窗口的消息,B处处理消息时,就会调用父窗口句柄HWND关联的回调函数,父窗口的回调函数就可以处理掉这个消息了。程序虽然在B处循环,但因为窗口回调函数这个设计的巧妙之处,使得无论何处的消息循环代码都可以处理掉所有窗口的消息。

To   cymvp():
我说的f()不会出现执行一半的情况,就是指函数内部没有消息循环的情况阿,你一个MessageBox()不就循环起来了,这样当然可能执行一般就来第二次了。
 
  • sangwf
  • 等 级:
发表于:2007-06-22 16:45:5550楼 得分:0
谢谢楼上的,也就是说肯定时单线程处理的,只有在弹出对话框时是特殊情况。
对于正常的消息执行,一定是执行完一个消息才能执行下一条么?
 
  • sangwf
  • 等 级:
发表于:2007-06-22 16:47:5051楼 得分:0
f()函数肯定是执行完一次才能进入下一次了?
 
发表于:2007-06-22 16:53:1352楼 得分:0
像上面所说的!
如果f()中不弹出摸态对话框的话
那肯定是执行完一次才能进入下一次了
 
  • sangwf
  • 等 级:
发表于:2007-06-22 16:56:1453楼 得分:0
嗯,问题是f()函数在不断的执行,程序还能接收到消息么?操作系统会不会把消息缓存起来的?
 
发表于:2007-06-22 16:58:0054楼 得分:0
就是消息机制
 
发表于:2007-06-22 16:59:3855楼 得分:0
没消息循环或处理的普通函数,肯定是一次一次来,请放心。

有消息队列保存的,不会丢掉。
 
  • sangwf
  • 等 级:
发表于:2007-06-22 17:01:1256楼 得分:0
是操作系统的消息队列还是程序本身的消息队列?
 
发表于:2007-06-22 17:02:3057楼 得分:0
你不用写代码保存消息的,操作系统帮你做了。
 
发表于:2007-06-22 17:08:2158楼 得分:0
操作系统会为你的当前线程维护一个消息队列!
你可以不用管它!
 
发表于:2007-06-22 17:10:4259楼 得分:0
我有一个问题:OnTimer()是不是同时执行多次?如果是,那么f()为什么不能同时执行多次?
 
发表于:2007-06-22 17:14:1660楼 得分:0
应该是一样的!
如果如果OnTimer()中不弹出摸态对话框的话
他也是顺序执行的
 
发表于:2007-06-22 17:16:1561楼 得分:0
OnTimer()里面什么都不写的话,或没有处理消息的话,怎么可能同时执行多次阿?
你自己写个
CString   str;
for   (int   i   =   0;i <INT_MAX;i++)
{
if   (i%100000==0)
{
str.Format( "%d/r/n ",i);
::OutputDebugString(str);
}
}
看看
 
发表于:2007-06-22 17:18:2062楼 得分:0
所谓“同时”多次执行,说白了,就是一种“变相”的递归出现的现象。
 
发表于:2007-06-22 17:18:2663楼 得分:0
好,那看看这段程序,你们说是哪个对话框先弹出,定时器是1秒:

static   int   i   =   0;
static   int   j   =   0;
void   CTimerDlg::OnTimer(UINT   nIDEvent)  
{
i=i+1;

CString   str;
if   (i==2)
{
KillTimer(nIDEvent);
str.Format( "%d,%d/r/n ",j,i);
MessageBox(str);

}
else   if(i==1)
{
Sleep(3000);
str.Format( "%d,%d/r/n ",j,i);
MessageBox(str);
}
CDialog::OnTimer(nIDEvent);
}
 
  • sangwf
  • 等 级:
发表于:2007-06-22 17:18:2664楼 得分:0
也就是操作系统本身没有一个统一的消息队列?只是有多个针对每个程序的队列?

Ontimer执行多次是在弹对话框的时候,如果不弹对话框,只能是顺续执行消息了,也就是在一个Ontimer调用执行完之后才可能执行下一个,不可能出现同时执行多次了。
 
发表于:2007-06-22 17:19:2465楼 得分:0
哈哈!
我们四个人撑起了这个热贴。。。。
 
发表于:2007-06-22 17:24:5766楼 得分:0
奥,我钻牛角尖了,我以为你们说Ontimer不会同时执行多次呢,如果有对话框,那么Ontimer()就会存在多个执行了一半的情况对吧?
 
  • sangwf
  • 等 级:
发表于:2007-06-22 17:25:1167楼 得分:0
这就奇怪了,我的理解要第二个先弹出的,毕竟整个线程挂起了。第一个不可能出现的,除非没等第二个弹出,又先处理了第一个的弹出消息,又让第一个先弹出来了。
 
发表于:2007-06-22 17:26:3568楼 得分:4
现在我把自己总结的说下!
当你在主消息循环的消息处理函数中弹出一个模态对话框!
他阻塞了主消息循环!
然后他自己创建一个消息循环来继续当前线程的消息处理!
你这时可以把主窗口关闭了!
但是因为这个弹出的模态对话框还在!它阻塞了winmain这个主消息循环!
所以程序不会退出!
说的应该没有错吧!
 
  • sangwf
  • 等 级:
发表于:2007-06-22 17:29:3769楼 得分:0
没错,关键是winmain没有获得焦点,如果获得了焦点,它的关闭消息会被子窗口处理掉,同样能够将其关闭。
 
发表于:2007-06-22 17:33:2870楼 得分:0
sangwf(★小三★)   你做的是第一个先弹出?
 
发表于:2007-06-22 19:28:5971楼 得分:0
To:zhejiang9(Why   not?)
现在我把自己总结的说下!
当你在主消息循环的消息处理函数中弹出一个模态对话框!
他阻塞了主消息循环!
然后他自己创建一个消息循环来继续当前线程的消息处理!
你这时可以把主窗口关闭了!
但是因为这个弹出的模态对话框还在!它阻塞了winmain这个主消息循环!
所以程序不会退出!
说的应该没有错吧!
==============================================================
有点错误,“你这时可以把主窗口关闭了!”这话有问题,主窗口关不掉
另外说一下关于这个Ontimer函数同时调用问题。
第一个WM_TIMER消息,调用Ontimer函数,然后创建一个对话框,同时这个对话框接管消息循环,这时第二个WM_TIMER   来到,由这个对话框来调用Ontimer,又同样建立一个对话框并接管消息循环。至于函数的执行过程,刚好和这个相反,有点像函数的递归 比如下面
A()
{
    static   i=0;
    i++;
    A()//好比弹出Model对话框
    i++;
}
 
发表于:2007-06-22 20:22:4272楼 得分:8
刚上线,cymvp()的例子肯定是下面的先弹出,不过因为Sleep(3000)的缘故,所以先后很不明显,基本区分不出来。

To   LS,zhejiang9(Why   not?)总结的很对阿,“你这时可以把主窗口关闭了!”这句话没有问题,确实可以关闭主对话框,而且程序不会退出的,不信你可以试试关不关的掉。另外LS说的递归的理解方式可以说跟我是不谋而合,个人感觉就是一种“变相”的递归
 
  • sangwf
  • 等 级:
发表于:2007-06-22 20:50:3473楼 得分:0
恩,递归的说法不错,确实是这么一回事。但是我的测试是第一个先弹出的,这就理解不明白了。先弹出的one   0,2;后弹出two   0,1。看数据值的话又好像two是先得到的才对。  
if   (i==2)
{
KillTimer(nIDEvent);
str.Format( "one   %d,%d/r/n ",j,i);
MessageBox(str);

}
else   if(i==1)
{
Sleep(3000);
str.Format( "two   %d,%d/r/n ",j,i);
MessageBox(str);
}
 
发表于:2007-06-22 20:55:3774楼 得分:8
我觉得是这样,有时候眼睛看到的弹出对话框的顺序可能会不太准,建议楼主用断点跟踪一下再看一下顺序,我也拿不准
 
发表于:2007-06-22 21:20:5175楼 得分:0
static   int   i   =   0;
if   (i >=2)   KillTimer(nIDEvent);
                  i++;
CString   str;
str.Format( "%d ",i);
MessageBox(str);
i++;
                  str.Format( "%d ",i);
MessageBox(str);
CDialog::OnTimer(nIDEvent);
 
  • sangwf
  • 等 级:
发表于:2007-06-23 23:33:5976楼 得分:0
我看不是眼睛的问题,在我的机器上第一个弹出几秒后,第二个才弹出的,所以还解释不清。
 
  • sangwf
  • 等 级:
发表于:2007-06-23 23:39:2577楼 得分:0
debug跟踪了一个,是第二个先弹出的,可能是我代码里写错了的缘故,写了两个:
CDialog::OnTimer(nIDEvent);
CDialog::OnTimer(nIDEvent);

同时,由于两个是连续弹出的,因为后弹出的会显示在最前端,所以one正好是显示在最前面的。
终于理解清楚了,谢谢以上各位,结贴~
 
发表于:2007-06-24 11:59:0078楼 得分:0
To   w_anthony()  
",“你这时可以把主窗口关闭了!”这句话没有问题,确实可以关闭主对话框,而且程序不会退出的,不信你可以试试关不关的掉。 "
这个怎么关啊,当前窗口的焦点在弹出的对话框上,根本无法向主窗口发送WM_CLOSE,怎么关闭?
 
  • sangwf
  • 等 级:
发表于:2007-06-25 10:50:3979楼 得分:0
我在测试过程中,还真有时可以一不小心把主窗口关掉的,不过概率比较低。
 
发表于:2007-06-25 15:58:4180楼 得分:0
To   red_berries(我再顶顶):

弹出的对话框设一个按钮或者定时器之类的,将主窗口EnableWindow(TRUE),你不就可以点了……
 
class="replyframe" id="replyframe" name="replyframe" src="http://forum.csdn.net/PointForum/Forum/ReplyTopic.aspx?forumID=f9fb995e-c93d-456a-8097-0b27ccb25c4e&topicID=28c00202-b68a-4fff-8b1e-daa534294c4f&postDate=2007-6-22 12:32:14" frameborder="0" width="100%" scrolling="no" height="490">
<script language="JavaScript" type="text/javascript">/**/</script>

<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> </script><script type="text/javascript"> _uacct = "UA-2919357-1"; urchinTracker(); </script><script src="http://www.csdn.net/ui/scripts/Csdn/counter.js" type="text/javascript"></script> id="myframe" border="0" name="myframe" src="http://www.csdn.net/ggmm/dd333.htm" frameborder="no" width="0" scrolling="no" height="0">  <script src="/u/ui/scripts/jsframework2.js" type="text/javascript"></script><script src="/u/ui/scripts/System/Plugins/Opera.js" type="text/javascript"></script><script src="/u/ui/scripts/System/Global.js" type="text/javascript"></script><script src="/u/ui/scripts/System/Net/MzJson.js" type="text/javascript"></script><script src="/u/ui/scripts/System/Web/Forms/MzEffect.js" type="text/javascript"></script><script src="/u/ui/scripts/System/Web/Forms/MzBehavior.js" type="text/javascript"></script><script src="/u/ui/scripts/System/Web/Forms/MzForm.js" type="text/javascript"></script><script src="/u/ui/scripts/System/Net/MzCookie.js" type="text/javascript"></script> <script src="/u/ui/scripts/Csdn/Forum/UserOnline.js" type="text/javascript"></script><script src="/u/ui/scripts/System/Web/Forms/MzLockWindow.js" type="text/javascript"></script><script src="/u/ui/scripts/System/Web/Forms/MzModalDialog.js" type="text/javascript"></script><script src="/u/ui/scripts/Csdn/Forum/TopicView.js" type="text/javascript"></script> 
网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
Copyright © 2000-2007, CSDN.NET, All Rights Reserved

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值