正文

work thread和UI thread的区别(包括产生以及终结)2010-03-23 18:55:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/manbuyuduan/50821.html

分享到:

一、线程产生篇:

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

阅读(3171) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册