读书人

关于进度条的有关问题

发布时间: 2012-12-31 11:57:51 作者: rapoo

关于进度条的问题
我新建了一个单文档的程序,其中有个菜单是连接设备的。点击该菜单,弹出一个对话框,输入IP之后点击连接,对话框关闭并弹出一个显示其连接进度的进度条(用户界面多线程程序)。我现在的问题是在这个进度条没有关闭之前,我不希望主框架能够响应任何操作,于是我是这么写的,
在点击连接的时候
void CConnectDlg::OnBnClickedOk()
{
EndDialog(-1);
pThread = AfxBeginThread(RUNTIME_CLASS(CProgressThread));//进度条对话框
hThread=pThread->m_hThread;
try
{
Connect(_T("IP地址!"));
}
catch(......)
{
::PostMessage(((CProgressThread*)pThread)->waitDlg.m_hWnd,WM_CLOSE,0,0);
pThread->PostThreadMessage(WM_QUIT,0,0);
while(WaitForSingleObject(hThread,200)==WAIT_TIMEOUT)
{
pThread->PostThreadMessage(WM_QUIT,0,0);
}
}
}
这个进度条进程CProgressThread里面
BOOL CProgressThread::InitInstance()
{
// TODO: perform and per-thread initialization here
m_pMainWnd = &waitDlg;//这个waitDlg是显示进度的对话框,上面只有一个进度条
SetWindowPos(waitDlg.m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_SHOWWINDOW);
waitDlg.DoModal();
return TRUE;
}

现在出现的问题是:在我debug的时候,就是用VS2008程序F5启动exe的时候,进度条关闭之前主框架是不能响应任何操作的,但是我直接运行exe的时候,在进度条关闭之前主框架就可以移动了。我有什么办法,使得这个waitDlg就是主框架的一个模式对话框,而不是另外生成的一个界面呢?请各位大侠予以指导。
[解决办法]
你怎么弄在两个进程里面?怪不得可以动主对话框

用一个进程。

你那个按钮按下去之后先DoModal进度条对话框,然后在进度条对话框中启动工作线程。
这个时候由于已经DoModal,就能获得窗体句柄,线程可以用SendMessage通知进度条对话框的进度条显示。

显示完到100%后,工作线程再见,进度条对话框再见,主对话框启用。

祝楼主早日成功
[解决办法]

引用:
引用:
引用:你怎么弄在两个进程里面?怪不得可以动主对话框

用一个进程。

你那个按钮按下去之后先DoModal进度条对话框,然后在进度条对话框中启动工作线程。
这个时候由于已经DoModal,就能获得窗体句柄,线程可以用SendMessage通知进度条对话框的进度条显示。

显示完到100%后,工作线程……

最好别用单线程,本来就是两个任务,用多线程比较安全,我之前写的就是用的多线程完全没问题。

读书人网 >VC/MFC

热点推荐