MFC的多线程.pdf
文本预览下载声明
深入浅出深入浅出Win32多线程设计之多线程设计之MFC的多线程的多线程
2006-01-19 14:08 作者:宋宝华 出处:天极开发 责任编辑:方舟
1 、创建和终止线程
在MFC程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版
本,分别对应工作者线程和用户接口(UI)线程。
工作者线程
CWinThread *AfxBeginThread(
AFX_THREADPROC pfnThreadProc, //控制函数
LPVOID pParam, //传递给控制函数的参数
int nPriority = THREAD_PRIORITY_NORMAL, //线程的优先级
UINT nStackSize = 0, //线程的堆栈大小
DWORD dwCreateFlags = 0, //线程的创建标志
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL //线程的安全属性
);
工作者线程编程较为简单,只需编写线程控制函数和启动线程即可。下面的代码给出了定义一个控制函
数和启动它的过程:
//线程控制函数
UINT MfcThreadProc(LPVOID lpParam)
{
CExampleClass *lpObject = (CExampleClass*)lpParam;
if (lpObject == NULL || !lpObject-
IsKindof(RUNTIME_CLASS(CExampleClass)))
return - 1; //输入参数非法
//线程成功启动
while (1)
{
...//
}
return 0;
}
//在MFC程序中启动线程
AfxBeginThread(MfcThreadProc, lpObject);
UI线程
创建用户界面线程时,必须首先从CWinThread 派生类,并使用 DECLARE_DYNCREATE 和
IMPLEMENT_DYNCREATE 宏声明此类。
下面给出了CWinThread类的原型(添加了关于其重要函数功能和是否需要被继承类重载的注释):
class CWinThread : public CCmdTarget
{
DECLARE_DYNAMIC(CWinThread)
public:
// Constructors
CWinThread();
BOOL CreateThread(DWORD dwCreateFlags = 0, UINT nStackSize = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
// Attributes
CWnd* m_pMainWnd; // main window (usually same AfxGetApp()-
m_pMainWnd)
CWnd* m_pActiveWnd; // active main window (may not be m_pMainWnd)
BOOL m_bAutoDelete; // enables delete this after thread
termination
// only valid while running
HANDLE m_hThread; // this threads HANDLE
operator HANDLE() const;
DWORD m_nThreadID; // this threads ID
int GetThreadPriority();
BOOL SetThreadPriority(int nPriority);
// Operations
DWORD SuspendThread();
DWORD ResumeThread();
BOOL PostThreadMessage(UINT message, WPARAM wParam, LPARAM lParam);
// Overridables
//执行线程实例初始化,必须重写
virtual BOOL InitInstance();
// running and idle processing
//控制线程的函数,包含消息泵,一般不重写
vi
显示全部