一个dlg为什么不能DoModal?

aidingding79 2006-07-24 05:24:22
我在自己的工程里添加了一个新的Dialog,然后用向导生成了这个对话框类Cdlg!
然后我在一个线程里Cdlg dlg;
dlg.DoModal(),Domodal竟然立即返回了,对话框也没弹出来!
请问这是怎么回是?和线程有关系吗?
...全文
431 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeSummer 2006-07-25
  • 打赏
  • 举报
回复
我说的那句话好象有错,有错的请指正哈//^-^.
KeSummer 2006-07-25
  • 打赏
  • 举报
回复
给你个现成的代码,这是我上次的软件里头的'应该和你的一样,怎么我的就能出个对话框呢?你自己参考一下有什么不同了.
DWORD WINAPI ClientLock(LPVOID lpParam)
{

AFX_MANAGE_STATE(AfxGetStaticModuleState());//切换资源环境
SetThreadDesktop(theApp.hNewDesktop);

theApp.isLocked=1;
CLockDlg dlg;
dlg.DoModal();
::OutputDebugString("CLockDlg dlg;");
while(true)//没有这个死循环,线程一下子就退出了,因为是普通线程不带消息循环的.
{
if(theApp.isLocked==0)
return 0;
Sleep(100);
}

return 0;
}
aidingding79 2006-07-25
  • 打赏
  • 举报
回复
但是我是跟踪过 Domodal的返回值的,是-1,也就是说是create失败,keSummer你是如何看这个问题的呢?
aidingding79 2006-07-25
  • 打赏
  • 举报
回复
哦~~~我来44看呢
KeSummer 2006-07-25
  • 打赏
  • 举报
回复
这是正常的!因为模式对话框阻塞的是消息循环!!!而不是程序执行流程!!因为你的线程根本没有消息循环,Domodal就立即返回了.

解决方法有:改成UI线程或者在调用对话框后加个无限循环(记住sleep(50)我就是这样解决的).
aidingding79 2006-07-25
  • 打赏
  • 举报
回复
没有,现在就是一个新导入的对话框模板,没作任何修改
zhang_zhibin 2006-07-25
  • 打赏
  • 举报
回复
有没有用richedit?
aidingding79 2006-07-25
  • 打赏
  • 举报
回复
似乎这个重载的构造函数并不存在啊?Cdlg dlg(IDD_DLG_TEMPLATE_ID,this);
的IDD_DLG_TEMPLATE_ID是Dialog的IDD吗?那么this指针又是指向那个对象呢?
Cdlg dlg(IDD_DLG_TEMPLATE_ID,this);编译不通过!
xqk 2006-07-25
  • 打赏
  • 举报
回复
Cdlg dlg(IDD_DLG_TEMPLATE_ID,this);
nRet = dlg.DoModal();

try!
healer_kx 2006-07-25
  • 打赏
  • 举报
回复
就是线程的原因啊,Dialog的模板是资源,MFC的资源只能是UI主线程创建和管理啊。
就是这么回事。!
aidingding79 2006-07-25
  • 打赏
  • 举报
回复
应该和线程是否起没关系吧?我到create里去跟踪了,发现是不能得到Dialog的摸板啊。
我用的是sdk的 CreateThread,是不是因为是这个原因呢?
mengfanzhang 2006-07-25
  • 打赏
  • 举报
回复
挺深奥的,没怎么看懂具体是什么意思。但是不明白为什么要切换环境资源?新线程在构造的时候是共享同一资源的?
aidingding79 2006-07-25
  • 打赏
  • 举报
回复
问题解决了,需要调用AFX_MANAGE_STATE(AfxGetStaticModuleState()),切换资源环境就能正常显示了。谢谢KeSummer代码的提示!
snowbirdfly 2006-07-24
  • 打赏
  • 举报
回复
恩~
该线程先挂起来一段时间看看~~~
cleverwyq 2006-07-24
  • 打赏
  • 举报
回复
线程sleep几秒看看
aidingding79 2006-07-24
  • 打赏
  • 举报
回复
我怀疑和线程的安全属性有关系,但是又不知道怎么设置,哪位高人帮忙解决啊?
wanilyer 2006-07-24
  • 打赏
  • 举报
回复
是不是你的那个线程结束了,然后对话框的生命周期也就结束了。
wanilyer 2006-07-24
  • 打赏
  • 举报
回复
没仔细看清楚是在另外一个线程中啊,这个不清楚,我对线程也不理解.
aidingding79 2006-07-24
  • 打赏
  • 举报
回复
对的,是一个多线程的程序,wanilyer说的我已经检查过了,没有问题,因为这个对话框在主线程里是可以弹出来的
snowbirdfly 2006-07-24
  • 打赏
  • 举报
回复
那你那个线程是自己新创建的线程了~~
那为什么新创建的线程调用就会返回-1呢??
加载更多回复(8)

15,979

社区成员

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

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