龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

VC中CWinThread类以及和createthread API的区别分析(2)

时间:2014-10-25 02:25来源:网络整理 作者:网络 点击:
分享到:
具体说来,CreateThread这个 函数是windows提供给用户的 API函数,是SDK的标准形式. AfxBeginThread,是编译器对原来的CreateThread函数的封装,用与MFC. 而_beginthrea

具体说来,CreateThread这个 函数是windows提供给用户的 API函数,是SDK的标准形式.
AfxBeginThread,是编译器对原来的CreateThread函数的封装,用与MFC.
而_beginthread是C的运行库函数。               
在使用AfxBeginThread时,线程函数的定义为:UINT  _yourThreadFun(LPVOID   pParam)
在使用CreateThread时,线程的函数定义为:  DWORD  WINAPI  _yourThreadFun(LPVOID pParameter)。

两个的实质都是一样的,不过AfxBeginThread返回一个CWinThread的指针,就是说他会new一个CWinThread对象,而且这个对象是自动删除的(在线程运行结束时),给我们带来的不便就是无法获得它的状态,因为随时都有可能这个指针指向的是一个已经无效的内存区域,所以使用时(如果需要了解它的运行状况的话)首先CREATE_SUSPENDED让他挂起,然后m_bAutoDelete=FALSE,接着才ResumeThread,最后不要了delete那个指针。

CreatThread就方便多了,它返回的是一个句柄,如果你不使用CloseHandle的话就可以通过他安全的了解线程状态,最后不要的时候CloseHandle,Windows才会释放资源(线程内核对象).
下面我们就来看一下AfxBeginThread函数的内部实现:

复制代码 代码如下:
//启动worker线程
CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,
    int nPriority, UINT nStackSize, DWORD dwCreateFlags,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs)
{

         ASSERT(pfnThreadProc != NULL);

         CWinThread* pThread = DEBUG_NEW CWinThread(pfnThreadProc, pParam);
         ASSERT_VALID(pThread);

         if (!pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize,
                  lpSecurityAttrs))
         {
                  pThread->Delete();
                  return NULL;
         }
         VERIFY(pThread->SetThreadPriority(nPriority));
         if (!(dwCreateFlags & CREATE_SUSPENDED))
                  VERIFY(pThread->ResumeThread() != (DWORD)-1);
         return pThread;
}

//启动UI线程
CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,int nPriority, UINT nStackSize, DWORD dwCreateFlags, LPSECURITY_ATTRIBUTES lpSecurityAttrs)
{

精彩图集

赞助商链接