我现在碰到了程序过程的嵌套问题,不知如何解决,请各位多多指点。是这样的(应用程序要求):
    在基于对话框的主程序中,有过程Fa,显示一子对话框功能(用全局变量保存其地址);另有过程Fb,开始时如果判断有子对话框,则根据全局变量发消息(WM_CLOSE)将其关闭,然后再显示另一子对话框(子对话框都属同一类);    过程Fa先调用,然后有一硬件设备发出信号(另一过程),调用过程Fb;    问题在于,过程Fb只关闭了Fa产生的对话框,但并没有结束过程Fa,而是等过程Fb结束后,才结束过程Fa,类似于DOS方式的中断过程;而现在我想当过程Fb关闭Fa产生的对话框后,立刻结束过程Fa,然后再运行过程Fb下面的内容,可就是不行,用多线程也不行,请各位指点。

解决方案 »

  1.   

    你可以建一个线程类,在InitInstance()里调用对话框,
    当调用Fb时,直接将调用对话框的那个线程杀死
      

  2.   

    ukyoking(累) :我用了,它只能关闭窗口,可所在过程不会结束
      

  3.   

    另需说明:过程Fa,Fb有5个,它们都是类似的,都是由那个硬件设备发信号控制的
      

  4.   

    请先告诉我你的过程Fa、Fb都是怎么创建的?
    如果是普通的线程,则必然有其退出条件,只要在另一个线程中使其条件满足即可。
    甚至于不得已,还可以采用TerminateThread之类的办法强制终止线程。
      

  5.   

    Fa,Fb,都是在主程序中,根据硬件设备发信号,它有个OnStatusUpdateEvent事件,只要硬件状态一改变,该事件就会执行,然后根据不同的信号,调用不同的过程Fa,Fb...
      

  6.   

    Fa,Fb都是主程序中的,那么它们倒底是什么?函数?进程?线程?看不太懂题意.楼主最好能写一个简化了的,能反映你的问题的示例程序,然后大家再讨论.也许当你能写出那个简化了程序时,你的问题就已经被你自己解决了.
      

  7.   

    fa, fb 改成线程就可以了。
    fb()
    {
      if (fa)
    {
      CloseDialogFA();
      WaitForSingleObject(fa);
      fa = NULL;
     }
    ...
    }使用其他的同步等等方法也行。
      

  8.   

    建议把fa的dialog改成无模式的,就不会有这问题了。
      

  9.   

    还有一个办法,在fb里这样处理,先sendmessage把fa的dialog关掉,然后post一个自定义的消息就退出,在这个消息里处理函数里做fb真正要做的事情。
    出现这样的问题是你的fa在打开dialog后一直在run的,只不过在里面会处理各种消息,虽然你sendmessage消息把dialog给关了,但fa还在run,因为处理fb消息的函数还没退出。
      

  10.   

    void CKeykeyDlg::OnStatusUpdateEvent(long Data) 
    {
    switch (Data)
    {
    case 1:
    {
    if (::g_pDlg != NULL)
    {
    AfxMessageBox("执行关闭");
    ::g_pDlg->SendMessage(WM_CLOSE, 0, 0);
    ::g_pDlg = NULL;
    } CPrompt dlgprompt;
    dlgprompt.DoModal(); AfxMessageBox("已关闭");
    }
    break; case 2:
    {
    if (::g_pDlg != NULL)
    {
    AfxMessageBox("执行关闭");
    ::g_pDlg->SendMessage(WM_CLOSE, 0, 0);
    ::g_pDlg = NULL;
    } CPrompt dlgprompt;
    dlgprompt.DoModal(); AfxMessageBox("已关闭");
    }
    break;
    }
    }其中::g_pDlg在dlgprompt的在析构和解构中取得值
      

  11.   

    其中Fa,Fb过程就对应case1,case2的内容;如果先执行case 1:的内容显示子对话框后,信号改变,又执行case 2:的内容,这时只有将最后一个子对话框正常结束后,才会结束case 1:的内容(显示case 1:中的“已关闭”);如果,信号不断来回改变,则case 1:与case 2:会互相嵌套,最终出错;
      

  12.   

    其中Fa,Fb过程就对应case1,case2的内容;如果先执行case 1:的内容显示子对话框后,信号改变,又执行case 2:的内容,这时只有将最后一个子对话框正常结束后,才会结束case 1:的内容(显示case 1:中的“已关闭”);如果,信号不断来回改变,则case 1:与case 2:会互相嵌套,最终出错;
      

  13.   

    定义两个消息MESSAGE1,MESSAGE2
    在case1里做:
    if (::g_pDlg != NULL)
    {
    AfxMessageBox("执行关闭");
    ::g_pDlg->SendMessage(WM_CLOSE, 0, 0);
    ::g_pDlg = NULL;      
    }
    PostMessage(MESSAGE1);//发一个MESSAGE1后面的处理放到MESSAGE1的处理函数里。case2也同样处理。当然在MESSGE1,MESSAGE2的处理里可以放上
    if (::g_pDlg != NULL)
    {
    AfxMessageBox("执行关闭");
    ::g_pDlg->SendMessage(WM_CLOSE, 0, 0);
    ::g_pDlg = NULL;    
            PostMessage(MESSAGE1);//发一个MESSAGE1
            return;
      
    }
      

  14.   

    初步看来,你的对话框不应该是模式对话框,而应该是非模式的.否则
    dlgprompt.DoModal();
    这句是不会立即返回,而是要到dlgprompt对象调用了EndDialog()方法后才会返回.
      

  15.   

    Zark(金陵五月) : 可是我的对话框必需要是模式的,而且我也试过EndDialog()方法,可是同样不行
      

  16.   

    如果必须是模式的,那么函数
    void CKeykeyDlg::OnStatusUpdateEvent(long Data);
    是一定要在不同的线程中同时被调用才能达到你的要求,是这样吗?
      

  17.   

    void CKeykeyDlg::OnStatusUpdateEvent(long Data);
    是由硬件信号确发的,不能被其它过程调用;我现在是想当case 1:执行显示子对话框后,硬件又发了一个信号,执行了case 2:内容;但现在程序没有将case 1:执行完,而是当case 2:行完后,才返回case 1:,然后结束OnStatusUpdateEvent(long Data);的执行
      

  18.   

    那个硬件信号产生后,是通过SendMessage还是通过PostMessage发出消息给CKeykeyDlg,以便调用OnStatusUpdateEvent方法的?