CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

线程和对话框问题

楼主voidman()2001-09-14 18:22:09 在 VC/MFC / 进程/线程/DLL 提问

为了表示主线程正在做费时操作,我做了一个函数BeginWaitWnd(),在这个函数里新开了一个用户界面线程,在线程的InitInstance()里Create了一个无模式的对话框来显示等待信息,将线程的m_pMainWnd指定为该对话框。  
  又有一个函数EndWaitWnd()是用来结束等待窗口的。  
   
  现在我建立一个主程序测试我的这两函数,代码如下  
  BeginWaitWnd();  
  for(int   i=0;i<10000;i++)  
          for(int   j=0;j<10000;j++);  
  EndWaitWnd();  
  问题出现了,  
  如果我将代码放在App的InitInstance,或者是在对话框的OnInitDialog等的里面都没有问题,但是放在OnOK,OnCancel,OnLButtonDown之类的函数里,就会等到费时操作完成后才弹出对话框(实际上是开了马上就关,我就看见一闪)  
  又,如果我把无模式的对话框变成了模式对话框就没有问题了。  
  ????? 问题点数:56、回复次数:12Top

1 楼richi_(跑)回复于 2001-09-14 18:32:03 得分 0

你create的时候有没有指定visible风格呢?  
  如果没有,那么,  
  你必须在create之后调用showwindow来显示无模式对话框。Top

2 楼voidman()回复于 2001-09-14 18:52:32 得分 0

我所说的"在App的InitInstance,或者是在对话框的OnInitDialog等的里面都没有问题",  
  是说把代码放在哪儿后,执行到该代码时成功的弹出消息窗口(我的机器执行下面的循环代码大概需要10s),维持一段时间(10s左右),然后自动关闭Top

3 楼regit(regit)回复于 2001-09-14 18:58:19 得分 0

可能你用了局部变量来存储对话框变量,  
  当函数运行结束,对话框就消失了Top

4 楼voidman()回复于 2001-09-14 19:03:19 得分 0

我用的new,不然怎么会有正确的时候Top

5 楼xj_h()回复于 2001-09-14 19:08:29 得分 0

raise  
  give   me   scoreTop

6 楼voidman()回复于 2001-09-14 20:17:58 得分 0

gzTop

7 楼voidman()回复于 2001-09-15 08:48:00 得分 0

gzTop

8 楼steventt(steven)回复于 2001-09-15 09:02:39 得分 0

我认为richi_说得对,我就碰到过这样的问题,加上ShowWindow(SW_SHOW)后就没问题了。VC就是这样,同样的代码,我在不同程序里实现的功能就不一样。在一些程序里我没加ShowWindow(SW_SHOW)也行,有一些就必须加ShowWindow(SW_SHOW)。Top

9 楼voidman()回复于 2001-09-15 09:24:04 得分 0

代码如下  
  HWND   g_hWnd=NULL;  
  void   BeginWaitWnd(LPCTSTR   lpszTitle/*=NULL*/,LPCTSTR   lpszInfo/*=NULL*/)  
  {  
  CString   title;  
  if(lpszTitle==NULL)  
  title="请稍候...";  
  else  
  title=lpszTitle;  
  CString   info;  
  if(lpszInfo==NULL)  
  info="请稍候...";  
  else  
  info=lpszInfo;  
   
  CWaitThread*   pThread=(CWaitThread*)  
  AfxBeginThread(RUNTIME_CLASS(CWaitThread),  
  THREAD_PRIORITY_NORMAL,  
  0,  
  CREATE_SUSPENDED);  
  pThread->m_Title=title;  
  pThread->m_Info=info;  
  pThread->m_bAutoDelete=FALSE;  
  g_pWaitThread=pThread;//全局变量保存  
  pThread->ResumeThread();  
  }  
  void   EndWaitWnd()  
  {  
  if(g_hWnd!=NULL)  
  PostMessage(g_hWnd,WM_CLOSE,NULL,NULL);  
  }  
  //线程函数  
  BOOL   CWaitThread::InitInstance()  
  {  
  CDialog*   pDlg;  
  pDlg=new   CWaitDlg;  
  pDlg->Create(IDD_WAITDLG,NULL);  
  g_hWnd=pDlg->m_hWnd;  
  pDlg->SetWindowText(m_Title);  
  (pDlg->GetDlgItem(IDC_WAITDLG_INFO))->SetWindowText(m_Info);  
  pDlg->SetIcon(LoadIcon(AfxGetResourceHandle(),  
  MAKEINTRESOURCE(IDI_CLOCK)),TRUE);  
  pDlg->ShowWindow(SW_SHOW);  
  m_pMainWnd=pDlg;  
  return   TRUE;  
  }  
  int   CWaitThread::ExitInstance()  
  {  
  int   nRet=CWinThread::ExitInstance();  
  if(nRet!=0)   return   nRet;  
  delete   ((CWaitDlg*)m_pMainWnd);  
  m_pMainWnd=NULL;  
  delete   this;  
  return   0;  
  }  
  对话框函数  
  void   CWaitDlg::OnClose()    
  {  
  EndDialog(IDOK);  
  }  
  Top

10 楼voidman()回复于 2001-09-15 09:26:12 得分 0

更正,上面的“g_pWaitThread=pThread;//全局变量保存”一句去掉  
          Top

11 楼voidman()回复于 2001-09-15 11:03:21 得分 0

gzTop

12 楼xj_h()回复于 2001-09-15 17:02:09 得分 56

改在函数里面开窗口,不要到线程里面开就可以啦Top

相关问题

  • 线程和对话框的问题
  • 如何在线程中引用对话框里的控件和变量???
  • 多线程中的对话框问题
  • 线程中创建动态对话框
  • 对话框类里定义了一个指向线程对象的指针,创建线程时用这个指针指向它,然后在对话框里用这个指针暂停和启动线程。可是老是有内存方面的
  • 有关多线程的问题.对话框线程
  • 如何在退出对话框时结束对话框的工作线程
  • 新开线程能否拥有自己的对话框?
  • 有关对话框、线程、数据交换的问题
  • 退出对话框时中止线程,似乎不容易

关键词

  • 线程
  • 函数
  • null
  • pdlg
  • 对话框
  • cwaitdlg
  • pmainwnd
  • pthread
  • nret
  • hwnd

得分解答快速导航

  • 帖主:voidman
  • xj_h

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo