寻求解决思路,很累了。

POSONE 2003-08-25 02:05:44
我现在碰到了程序过程的嵌套问题,不知如何解决,请各位多多指点。

是这样的(应用程序要求):
在基于对话框的主程序中,有过程Fa,显示一子对话框功能(用全局变量保存其地址);另有过程Fb,开始时如果判断有子对话框,则根据全局变量发消息(WM_CLOSE)将其关闭,然后再显示另一子对话框(子对话框都属同一类);

过程Fa先调用,然后有一硬件设备发出信号(另一过程),调用过程Fb;

问题在于,过程Fb只关闭了Fa产生的对话框,但并没有结束过程Fa,而是等过程Fb结束后,才结束过程Fa,类似于DOS方式的中断过程;而现在我想当过程Fb关闭Fa产生的对话框后,立刻结束过程Fa,然后再运行过程Fb下面的内容,可就是不行,用多线程也不行,请各位指点。
...全文
68 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zark 2003-08-30
  • 打赏
  • 举报
回复
那个硬件信号产生后,是通过SendMessage还是通过PostMessage发出消息给CKeykeyDlg,以便调用OnStatusUpdateEvent方法的?
fanfyj 2003-08-29
  • 打赏
  • 举报
回复
up
POSONE 2003-08-29
  • 打赏
  • 举报
回复
void CKeykeyDlg::OnStatusUpdateEvent(long Data);
是由硬件信号确发的,不能被其它过程调用;

我现在是想当case 1:执行显示子对话框后,硬件又发了一个信号,执行了case 2:内容;但现在程序没有将case 1:执行完,而是当case 2:行完后,才返回case 1:,然后结束OnStatusUpdateEvent(long Data);的执行
POSONE 2003-08-29
  • 打赏
  • 举报
回复
手上还有一个问题没有解决,过会就回来试
useruseruser 2003-08-29
  • 打赏
  • 举报
回复
?
dhyuser10 2003-08-29
  • 打赏
  • 举报
回复
xuexi
oo 2003-08-29
  • 打赏
  • 举报
回复
再定义两个消息的方法不行?
按理应该可以的。
POSONE 2003-08-29
  • 打赏
  • 举报
回复
up
POSONE 2003-08-28
  • 打赏
  • 举报
回复
Zark(金陵五月) : 可是我的对话框必需要是模式的,而且我也试过EndDialog()方法,可是同样不行
Zark 2003-08-28
  • 打赏
  • 举报
回复
如果必须是模式的,那么函数
void CKeykeyDlg::OnStatusUpdateEvent(long Data);
是一定要在不同的线程中同时被调用才能达到你的要求,是这样吗?

POSONE 2003-08-28
  • 打赏
  • 举报
回复
z up
vbhelp 2003-08-27
  • 打赏
  • 举报
回复
如果在一个应用中,用函数指针就很好管理呀!!!!
Zark 2003-08-27
  • 打赏
  • 举报
回复
初步看来,你的对话框不应该是模式对话框,而应该是非模式的.否则
dlgprompt.DoModal();
这句是不会立即返回,而是要到dlgprompt对象调用了EndDialog()方法后才会返回.
Zark 2003-08-26
  • 打赏
  • 举报
回复
Fa,Fb都是主程序中的,那么它们倒底是什么?函数?进程?线程?

看不太懂题意.楼主最好能写一个简化了的,能反映你的问题的示例程序,然后大家再讨论.也许当你能写出那个简化了程序时,你的问题就已经被你自己解决了.
POSONE 2003-08-26
  • 打赏
  • 举报
回复
Fa,Fb,都是在主程序中,根据硬件设备发信号,它有个OnStatusUpdateEvent事件,只要硬件状态一改变,该事件就会执行,然后根据不同的信号,调用不同的过程Fa,Fb...
oo 2003-08-26
  • 打赏
  • 举报
回复
定义两个消息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;

}
POSONE 2003-08-26
  • 打赏
  • 举报
回复
其中Fa,Fb过程就对应case1,case2的内容;

如果先执行case 1:的内容显示子对话框后,信号改变,又执行case 2:的内容,这时只有将最后一个子对话框正常结束后,才会结束case 1:的内容(显示case 1:中的“已关闭”);

如果,信号不断来回改变,则case 1:与case 2:会互相嵌套,最终出错;
POSONE 2003-08-26
  • 打赏
  • 举报
回复
其中Fa,Fb过程就对应case1,case2的内容;

如果先执行case 1:的内容显示子对话框后,信号改变,又执行case 2:的内容,这时只有将最后一个子对话框正常结束后,才会结束case 1:的内容(显示case 1:中的“已关闭”);

如果,信号不断来回改变,则case 1:与case 2:会互相嵌套,最终出错;
POSONE 2003-08-26
  • 打赏
  • 举报
回复
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的在析构和解构中取得值
xiaohedou 2003-08-26
  • 打赏
  • 举报
回复
大家的思路真好!我学习!
加载更多回复(9)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧