|
这个例子是 VC++ 高级编程技术与实例 第五章多线程的一个例子
1:
建立一个基于对话框的程序Test
2:
在对话框上放置一个按钮IDC_BT_START.和一个进度条控件IDC_PROGRESS1
并为IDC_PROGRESS1关联一个变量m_progress;
3:
在TestDlg.h文件中,定义一个结构体
struct threadInfo
{
CProgressCtrl * p_Progress;
CDialog * p_Dlg;
int second; //进度条暂停时
}
4:
在TestDlg.cpp文件中
#define USER_PROC_FINISHED WM_USER+1
threadInfo Info;
UINT ThreadProc(LPVOID pParam)
{
threadInfo * p=(threadInfo *)pParam;
for(int i=0;i<=100;i++)
{
p->p_Progress->SetPos(i);
::Sleep(p->second*10);
}
::PostMessage(p->p_Dlg->GetSafeHwnd(),USER_PROC_FINISHED,0,0);
return 0;
}
5:
在按钮IDC_BT_START的单击响应中:
void CTestDlg::OnBtStart()
{
Info.p_Progress=&m_progress;
Info.p_Dlg=this;
Info.second=1;
AfxBeginThread(ThreadProc,&Info);
}
6:
在TestDlg.h中声明消息函数
.........
//}}AFX_MSG
afx_msg void OnFinish();
7.
在TestDlg.cpp文件中
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
.......
ON_BN_CLICKED(IDC_BT_START, OnBtStart)
//}}AFX_MSG_MAP
ON_MESSAGE(USER_PROC_FINISHED,OnFinish)
END_MESSAGE_MAP()
void CTestDlg::OnFinish()
{
SetDlgItemText(IDC_BT_START,"线程结束请重新启动");
}
在候捷译的<Win32 多线程程序设计>书中p294中说:
1:
MFC有一个重大限制,会影响你所做的几乎每一件事情,MFC各对象和Win32 handles之间的映射关系记录在线程局部存贮中(TLS),因此你没有办法把一个MFC对象从某个线程手上交到另一个线程手上,你也不能在线程之间传递MFC对象指针.这里的指针包含(担不限于)CWnd,CDC,CPen,CBrush,CFont,Cbitmap,CPalette........
2:这个限制的意思是说,你不能够放一个指针(指向一个CWnd)到一个结构中,而该结构被一个Worker线程使用,你也不能够把一个指向CDialog或CView的指针交给另一个线程.............在线程之间共享对象,这里倒有一个不大方便的替代方案,不要放置MFC对象,改放对象的handle,你可以利用GetSateHwnd()获得派生自CWnd对象的handle,CDialog.
上各程序中
void CTestDlg::OnBtStart()
{
Info.p_Progress=&m_progress; //传递进度条的地址,不对吧?? 进度条派生自CWnd
Info.p_Dlg=this; //传递对话框的指针,不对吧?? 进度条派生自CWnd
Info.second=1;
AfxBeginThread(ThreadProc,&Info);
}
threadInfo Info;
UINT ThreadProc(LPVOID pParam)
{
threadInfo * p=(threadInfo *)pParam;
for(int i=0;i<=100;i++)
{
p->p_Progress->SetPos(i);//利用所传进度条的地址,调用进度条的成员函数,不对吧??.
::Sleep(p->second*10);
}
::PostMessage(p->p_Dlg->GetSafeHwnd(),USER_PROC_FINISHED,0,0);
//(p->p_Dlg->GetSafeHwnd() 利用所传对话框的this指针,调用成员函数GetSafeHwnd(),不对吧??.
return 0;
}
|
|