这个问题很奇怪,希望大家帮助! 
我做一个登录界面,由于登录时间过长,所以我在登录时用了一个线程,然后启动一个对话框,线程结束后,我关闭这个对话框,会出现问题,我把我的思路写一下,大家看有没有问题呢? 
第一步、选择菜单上的登录按钮,然后进入登录的函数,弹出输入用户名及密码确定。 
第二步、确定后,我启动一个线程,然后启动一个全局的对话框类。 
第三步、线程结束后,我给这个全局对话框发送一个消息。 
问题就出在第三步上,我发送完后,总会有问题出现,不知道为什么? 
具体的代码,大家看一下 
CMainFrame.h中 
CDialog InfoDlg; CMainFrame.cpp中 
void CMainFrame::OnConnect() 

   CDialog LonginDlg;//输入用用户名密码 
   if(LonginDlg.DoModal() == IDOK) 

    CreateThread();//启动登录线程//线程结束会发送一个成功的消息,会激活OnLonginSuccess函数 
  InfoDlg.DoModal(); 

} void CMainFrame::OnLonginSuccess() 

    if(LonginDlg.GetSafeHwnd() != NULL) 
      LonginDlg.SendMessage(WM_COMMAND,IDCANCEL,0); } 
奇怪的问题来了,这样做,不是每次都有问题,当我启动一个定时器,时间设置为1毫秒的时候,错误的频率就高了,为什么会产生这样的问题呢

解决方案 »

  1.   

    更正 
    void CMainFrame::OnLonginSuccess()  
    {  
        if(InfoDlg.GetSafeHwnd() != NULL)  
          InfoDlg.SendMessage(WM_COMMAND,IDCANCEL,0);  
    }  
    还有就是错误提示的信息是 
    File : wincore.cpp 
    line: 3475 我知道这个应该不算是什么大的错误,如果在release下,肯定没问题,只有在debug下才会弹出的,如果我选择重试或者忽略都不会对程序产生什么影响,会继续正常运行的!但是我想让他在debug下也正常运行。
      

  2.   

    为什么需要全局的对话框,局部变量也应该OK的。
    InfoDlg.SendMessage(WM_CLOSE,0,0);你这样用全局变量会有问题的,你发送消息关闭后,如果再次点击登陆,此时这个全局的InfoDlg已经被关闭销毁了。
      

  3.   

    本帖最后由 laiyiling 于 2008-04-30 14:47:12 编辑
      

  4.   

    为什么需要全局的对话框,局部变量也应该OK的。 
    InfoDlg.SendMessage(WM_CLOSE,0,0); 你这样用全局变量会有问题的,你发送消息关闭后,如果再次点击登陆,此时这个全局的InfoDlg已经被关闭销毁了。不会的,在第二次的时候,会在DoModal的时候重新那一个对话框的
    你说的第二种方法,我可以试一下,不过,不知道,WaitForSinglObject会不会阻塞消息进程,要是阻塞了,那对话框中的进度条就会不好用了
      

  5.   

    登录界面在CWinApp:InitInstance()中就可调用了吧.
    试下非模式对话框,并在该对话框中加入一个更新登录进度的函数.
    CMyApp::InitInstance()
    {
    g_wndMsg.Create() ;
    g_wndMsg.CenterWindow() ;
    g_wndMsg.SetMsg( "正在初使化主系统...",1) ;
    g_wndMsg.ShowWindow(SW_SHOW);//
    g_wndMsg.UpdateWindow();
     //...后继的初使化过程调用g_wndMsg.SetMsg()设置初使化进度。因为是全局对话框,甚至到视图类的初使化函数中依然可调用.
    }
    CWelcomeDlg中:
    //sMsg为当前操作步骤说明,nPer为当前完成百分比.nPer等于100时关闭对话框。
    void SetMsg( const CString& sMsg, int nPer ) ;
      

  6.   

    当然如果直接用,可能会阻塞的,大致参考一下下面的代码.while(::PeekMessage(&msg, NULL, 0, 0) && WaitForSinglObject(hThread, ....) )
    {
    if (msg.message == XXXXX)
    /////
    else
    {
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
    }
    }
      

  7.   

    会不会登陆过程有时太快,全局对话框还没来得及准备好就收到了消息?这个应该不会。我在输出的文本中,可以看到OnInitDialog已经执行,完成,我发送的关闭消息也已经被OnCancel收到,也正常返回,但是在OnCancel和OnDestroy之前产生错误提示,当对错误提示选择重试或者是忽略,这样OnDestroy就会被执行了,然后程序工作正常laiyiling:你是办法我可以试一试
      

  8.   

    现在我想知道问题的关键点,我这样用是不对的吗,不对在哪儿呢,还是MFC对消息对列,被我这样的使用方法给打乱了才产生的问题呢,我在问题中说到过,如果OnTimer设置长点,就不会产生这样的问题,或者说是不会经常产生这样的问题
      

  9.   

    InfoDlg.SendMessage(WM_COMMAND,IDCANCEL,0);   
    ——这里试试PostMessage看,跨线程SendMessage可能会有问题的。每个窗口的消息应该在创建该窗口的线程中被处理。
      

  10.   

    关键看你TIMER在做什么,因为如果你的Timer时间很短,很容易引起重入问题(也就是第一次Timer所调用的函数还没有返回,又到了第二次Timer的时间,系统仍然会重新开始执行函数,不管第一次执行是否完成),这样就有可能同一个函数,同时被两次执行.
      

  11.   

    http://xiabl.blog.ccidnet.com/blog.php?do=showone&itemid=122258&typ=blog
      

  12.   

    http://xiabl.blog.ccidnet.com/blog.php?do=showone&itemid=122258&typ=blog
    这个地址我上了,也按照所说的进行了修改,还是有问题