关于向导的OnWizardFinish问题(老问题回顾)

tomcat_jb 2004-04-13 09:58:19
我在最后一个PAGE里面的OnWizardFinish消息中不希望马上调用
return CPropertyPage::OnWizardFinish();
希望进行网络通信成功后在子定义消息处理函数里面再销毁PAGE,但是好象 CPropertyPage::OnWizardFinish();如果不在继承类的重载中调用就没有效果。各位有什么办法?谢谢

之前问过这样的问题,但是尝试后不能实现,主线程会锁死,之前的朋友提供的方法如下:

--------------------------------------------------------------------------
zhangcrony(为了不再郁闷地生活﹐我不得不郁闷地工作)
The only way is to use multi-thread to implement, I think

fzd999(花差花差) ( )
尝试着用线程来解决吧

tomcat_jb(老猫)
to happyparrot(快乐鹦鹉): 在自定义的消息函数里面再调用CPropertyPage::OnWizardFinish();不行。其他消息尝试过也不行,有ONOK什么的,WM_CLOSE也不可以。

to zhangcrony(为了不再郁闷地生活﹐我不得不郁闷地工作) :多线程也不好实现,我的界面层和通信层是分开的,也就是说,通信层接受到消息后,放入队列进行处理,通信层不关心通信的内容,只有到界面层才会DISPATCH PACKET。也就是说,我只能这样处理,在OnWizardFinish();里面启动一个线程,线程加信号锁,等待消息返回后释放线程的信号,线程结束并将另外一个信号释放.


已经修改了,只有把通信层做了一个处理,在通信线程里面,释放一个全局的信号量来控制主线程的进度。谢谢各位支持。

--------------------------------------------------------------------------
当时我总结了后觉得可以实现就结帖了,后来测试部反映当配置失败时GUI会锁死,确实,虽然我把通信放在了线程里面,但是好象还是无法将主线程激活。请各位指教,谢谢。
...全文
261 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomcat_jb 2004-05-09
  • 打赏
  • 举报
回复
我的阻塞通信中是DISABLE了FINISH BUTTON的,只有在通信完毕后,才会ENABLE BUTTON。所以不会出现你描述的通信未返回的原因。
tomcat_jb 2004-05-09
  • 打赏
  • 举报
回复
我是这样做,在SHEET类里面的::OnWizFinish()里面加上如下代码

CTaskWzdReport * pWzdPage = (CTaskWzdReport *)GetPage(8);
pWzdPage->SetConfig();//阻塞通信
if (m_pLogfwm->arrivepacket->dwErrorCode == 0)//根据返回值决定是否退出
{
CPropertySheet::PressButton(PSBTN_FINISH);
return;
}
以上代码,在按下第一次的时候,m_pLogfwm->arrivepacket->dwErrorCode 已经为0,但是没有退出,但是,第二次按下FINISH后,可以退出。但是逻辑上已经错了。

你说的情况我没试,如果你使用没问题,我改过去很复杂,里面SHEET和PAGE的交互很多,PAGE也很多,实在不愿意回头再去改PAGE的父类。麻烦你再看看我这样用为什么不可以。谢谢。
CSDNXX 2004-05-05
  • 打赏
  • 举报
回复
学习。。。
vollin 2004-05-05
  • 打赏
  • 举报
回复
你那种情况看是不是响应时间的问题,因为你可能是另开了一个线程来做判断,所以当你点了第一次的时候你的线程正在做判断还没有做完,而你这时是可以动界面的,当你点第二次的时候,或许就处理完了,然后就关闭了。你可以试着在做判断之前先阻塞界面线程,然后就不会有这种情况了。
vollin 2004-05-05
  • 打赏
  • 举报
回复
怎么会呢?我一直都是这样子做的,从来没出什么问题啊,只点一下就OK了。
我具体是这样子做了,在CSheet的OnWizFinish()里调用当前CPage的CanFinish()函数。
(CPage就做为所有Page的父类,其中CanFinish是一个虚函数,默认返回TRUE,当需要在Finish之前做判断的就在那一页里面的CanFinish中做出判断,不行就返回FALSE)
对于NEXT也一样。
tomcat_jb 2004-04-27
  • 打赏
  • 举报
回复
vollin(林尚义) ( )


CPropertySheetEx::PressButton(PSBTN_FINISH);
return;

这样好象返回不了,点第一次没变化,点第二次才会退出。
liuxingjian 2004-04-17
  • 打赏
  • 举报
回复
up
vollin 2004-04-15
  • 打赏
  • 举报
回复
class sheet: public CPropertySheet//定义一个类,继承自CPropertySheet或CPropertySheetEx
定义一个虚函数
virtual afx_msg void OnWizFinish(); //按下Finish
在消息循环中加入
ON_BN_CLICKED(ID_WIZFINISH, OnWizFinish)
以下是函数体
void CSheet::OnWizFinish()
{
//加入你自己的代码,如果不成功就return;
....
//成功后就
CPropertySheetEx::PressButton(PSBTN_FINISH);
return;
}
vollin 2004-04-15
  • 打赏
  • 举报
回复
这个我知道,而且我还专上写了一个类来做这些事,其实并不麻烦,听我慢慢道来。
modena 2004-04-15
  • 打赏
  • 举报
回复
我一般会采用事件去做通信线程和主线程的通知体系

我觉得不知道这样可不可以:
在按下FINISH后,进行网络通信,线程里面处理通信结果,如果通信正常释放一个信号量,但是如果通信不正常,也释放一个信号量,置一个变量标志通信的成功与否甚至出错原因标识值,主线程得到信号量后检查标识值,如果成功,那么退出,如果不成功,根据错误原因弹出一个AFXMESSAGEBOX。
另外如果信号两存在于两个线程中,如果每个线程都释放,那么可能需要对释放代码进行互锁,如果指定线程释放,需要考虑该信号量在另外一个线程内的生存期。

这两天生病在家,头疼的厉害,不知道以后还能不能编程了。借楼主宝地发发牢骚,楼主莫怪。
tomcat_jb 2004-04-14
  • 打赏
  • 举报
回复
up
tomcat_jb 2004-04-14
  • 打赏
  • 举报
回复
之前我的AFXMESSAGEBOX确实是在主线程中,是在DISPATCH MESSAGE的循环之前。为了这个问题,我不得不吧消息分发放到了线程中,也就是把DISPATCH MESSAGE的函数放到线程里面去处理,这个时候AFXMESSAGEBOX是针对所有通信的错误进行提示,而不是只针对这个错误。

我的信号量确实在两个线程中,觉得就是因为线程弹了一个AFXMESSAGEBOX。能具体讲讲如何利用多线程避免这个问题吗?
fanfyj 2004-04-14
  • 打赏
  • 举报
回复
up
wj59 2004-04-14
  • 打赏
  • 举报
回复
还是多线程同步的问题
tomcat_jb 2004-04-14
  • 打赏
  • 举报
回复
up
flyelf 2004-04-13
  • 打赏
  • 举报
回复
信号量在同一个线程依然会死锁,建议使用多线程
modena 2004-04-13
  • 打赏
  • 举报
回复
还是不太明白!说说根据我的理解说几句,能有帮助最好,希望不要误导楼主或浪费楼主的时间
1.不知道你的AfxMessageBox应该交由GUI线程去做,我的理解是通信线程不应该出现弹出错误信息的窗口,而通过事件等去通知GUI线程去报错。在非GUI线程弹出对话框我觉得不可取。
2.从另外一个角度,我觉得不管是新建的线程成功或者失败,其都需要通知线程管理者,并知会结果,比如说通信成功,发一个成功的信息,失败就发一个失败的信息。
3.在不正常后应该先通知主线程做互锁处理后在报出错信息。
tomcat_jb 2004-04-13
  • 打赏
  • 举报
回复
up
tomcat_jb 2004-04-13
  • 打赏
  • 举报
回复
楼上没明白我的意思,我是说,在按下FINISH后,进行网络通信,线程里面处理通信结果,如果通信正常释放一个信号量,主线程得到信号量后退出,但是如果通信不正常,我会弹出一个AFXMESSAGEBOX,但是这个时候主线程就锁死了,线程释放了信号量,主线程也不退出。
modena 2004-04-13
  • 打赏
  • 举报
回复
个人觉得创建线程是正确的方法,但配置有效能够正常,而配置失败GUI会锁死应该是因为配置失败引起GUI锁死,应该查找如果配置失败的处理路径为何引起互锁失败

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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