线程和对话框问题
为了表示主线程正在做费时操作,我做了一个函数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




