读书人

多线程统制非模式对话框进度条

发布时间: 2013-01-08 14:02:14 作者: rapoo

多线程控制非模式对话框进度条
在一个按钮事件中,创建了一个对话框,对话框上有一个进度条。
然后用AfxBeginThread 创建一个线程,线程控制进度条运行。
主线程运行一些耗时的程序,在程序完成后,把进度条设置到最大值,并关闭对话框。

小弟第一次接触多线程,请问下面的代码怎么跑不出我需要的结果呢。
先谢谢各位大大的帮忙
AfxBeginThread(ThreadFunOne, &progressDlg->m_Progress);将第二个参数改为this也不行



CProgressDlg *progressDlg;
progressDlg = new CProgressDlg;
progressDlg->Create(IDD_PROGRESS_DLG, NULL);
progressDlg->ShowWindow(TRUE);
progressDlg->m_Progress.SetRange(0,1000);
AfxBeginThread(ThreadFunOne, &progressDlg->m_Progress);

(这里省略了一些计算代码)

CWnd* pRgressDlg = FindWindow(NULL, _T("请耐心等待!"));
CProgressDlg *progress = (CProgressDlg*)pRgressDlg;
progress->m_Progress.SetPos(1000);
Sleep(300);
::SendMessage(pRgressDlg->m_hWnd, WM_CLOSE, 0, 0);




线程函数:
UINT ThreadFunOne(LPVOID pParam)
{
CProgressDlg *pRgressDlg = (CProgressDlg*)pParam;

for (int setPos=1; setPos<=1000; setPos+=100)
{
Sleep(100);
::SendMessage(pRgressDlg->m_hWnd, WM_UPDATE_DLG_POS, setPos, NULL);
}

return 0;
}
消息处理程序:
LRESULT CProgressDlg::OnUpdateProgressPos(WPARAM wParam, LPARAM lprama)
{
m_Progress.SetPos((int)wParam);
return 0;
}






线程函数ThreadFunOne ,单步跟踪就只进来了,里面根本没执行,等到主线程都跑完了,才又跳进ThreadFunOne运行
[解决办法]
试试这样写:
thrdHandle = CreateThread(NULL,0,ThreadProc_Recv,(LPVOID)pRecv,0,&threadRecvId);
[解决办法]
楼主,就是上次那个帖子吧。

我突然想起来,非模态对话框没有自己的消息循环。

把消息发到CProgressDlg(这个是非模态窗体吧?)的父窗体。
让他来控制就肯定没问题了。

还有问题,你联系我,晚上我帮你调试下,上次有点误导你了。不好意思。呵呵
[解决办法]
CProgressDlg 是否接收到WM_UPDATE_DLG_POS消息

读书人网 >VC/MFC

热点推荐