work thread和UI thread的区别(包括产生以及终结)(转)

来源:互联网 发布:oltp数据库 编辑:程序博客网 时间:2024/06/08 06:15

一、线程产生篇:

它们都需要呼叫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)。

 

来源:http://hi.baidu.com/dajiangfengdu2/blog/item/e7d513348d23851a91ef39a6.html

原创粉丝点击