对界面控件的操作尽量不要在线程里操作,而是在响应消息里进行
//C++// 自定义消息号
#define WM_MY_MESSAGE WM_USER+1
class CMyDlg : public CDialog
{
...
public:
// 自定义消息响应函数
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
...
private:
// 假设这个函数启动线程
void StartThread();
private:
CProgressCtrl m_progressCtrl;
...
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
...
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
END_MESSAGE_MAP()
...
// 使用wParam作为progressCtrl的位置参数
LRESULT CMyDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
int nPos = (int)wParam;
this->m_progressCtrl.SetPos(nPos);
return 0;
}
void CMyDlg::StartThread()
{
// 将this指针作为参数传递给线程函数
AfxBeginThread(ThreadProc, this);
}
UINT ThreadProc(LPVOID p)
{
// 指针类型转换
CMyDlg* pDlg = (CMyDlg*) p;
int nPos = 0; // progressCtrl进度条位置
// 对进度条位置的一些处理
...
// 发送消息给窗体,第一个参数是进度条位置信息
pDlg->SendMessage(WM_MY_MESSAGE,(WPARAM)nPos, 0);