一、线程产生篇:
它们都需要呼叫AfxBeginThread 以产生一个 CWinThread 对象,并在创建对象的时候定义其消息响应函数,下面代码是work thread所呼叫的AfxBeginThread函数:
CWinThread* pThread = AfxBeginThread(ThreadFunc, &Param);
函数原型是:
CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
但如果要产生一个UI thread,你还必须先定义一个 CWinThread 衍生类别,因为现在需要一个消息回路,CWinThread::Run里头就有一个消息回路,然后再呼叫AfxBeginThread产生一个CWinThread对象。下面代码是UI thread所呼叫的AfxBeginThread()函数:
CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS(CMyThread));
函数原型是:
CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
注意:UI thread的消息响应函数原型和work thread的消息响应函数是两个不同的重载函数。
二、线程结束篇
既然 worker thread 的生命就是线程函数本身,函数一旦 return,线程也就结束了,自然得很。或者线程函数也可以呼叫 AfxEndThread,结束一个线程。UI 线程因为有消息回路的关系,必须在消息队列中放一个 WM_QUIT,才能结束线程。放置的方式和一般Win32 程序一样,呼叫 ::PostQuitMessage 即可办到。亦或者,在线程的任何㆒个函数㆗呼叫 AfxEndThread,也可以结束线程。AfxEndThread 其实也是个外包装,其内部呼叫 _endthreadex,这个动作才真正把线程结束掉。
别忘了,不论 worker thread 或 UI thread,都需要㆒个 CWinThread 对象,当线程结
束,记得把该对象释放掉(利用 delete)。
评论