我现在碰到了程序过程的嵌套问题,不知如何解决,请各位多多指点。是这样的(应用程序要求):
在基于对话框的主程序中,有过程Fa,显示一子对话框功能(用全局变量保存其地址);另有过程Fb,开始时如果判断有子对话框,则根据全局变量发消息(WM_CLOSE)将其关闭,然后再显示另一子对话框(子对话框都属同一类); 过程Fa先调用,然后有一硬件设备发出信号(另一过程),调用过程Fb; 问题在于,过程Fb只关闭了Fa产生的对话框,但并没有结束过程Fa,而是等过程Fb结束后,才结束过程Fa,类似于DOS方式的中断过程;而现在我想当过程Fb关闭Fa产生的对话框后,立刻结束过程Fa,然后再运行过程Fb下面的内容,可就是不行,用多线程也不行,请各位指点。
在基于对话框的主程序中,有过程Fa,显示一子对话框功能(用全局变量保存其地址);另有过程Fb,开始时如果判断有子对话框,则根据全局变量发消息(WM_CLOSE)将其关闭,然后再显示另一子对话框(子对话框都属同一类); 过程Fa先调用,然后有一硬件设备发出信号(另一过程),调用过程Fb; 问题在于,过程Fb只关闭了Fa产生的对话框,但并没有结束过程Fa,而是等过程Fb结束后,才结束过程Fa,类似于DOS方式的中断过程;而现在我想当过程Fb关闭Fa产生的对话框后,立刻结束过程Fa,然后再运行过程Fb下面的内容,可就是不行,用多线程也不行,请各位指点。
当调用Fb时,直接将调用对话框的那个线程杀死
如果是普通的线程,则必然有其退出条件,只要在另一个线程中使其条件满足即可。
甚至于不得已,还可以采用TerminateThread之类的办法强制终止线程。
fb()
{
if (fa)
{
CloseDialogFA();
WaitForSingleObject(fa);
fa = NULL;
}
...
}使用其他的同步等等方法也行。
出现这样的问题是你的fa在打开dialog后一直在run的,只不过在里面会处理各种消息,虽然你sendmessage消息把dialog给关了,但fa还在run,因为处理fb消息的函数还没退出。
{
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的在析构和解构中取得值
在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;
}
dlgprompt.DoModal();
这句是不会立即返回,而是要到dlgprompt对象调用了EndDialog()方法后才会返回.
void CKeykeyDlg::OnStatusUpdateEvent(long Data);
是一定要在不同的线程中同时被调用才能达到你的要求,是这样吗?
是由硬件信号确发的,不能被其它过程调用;我现在是想当case 1:执行显示子对话框后,硬件又发了一个信号,执行了case 2:内容;但现在程序没有将case 1:执行完,而是当case 2:行完后,才返回case 1:,然后结束OnStatusUpdateEvent(long Data);的执行