读书人

为什么说MFC程序里面不要调用_beginth

发布时间: 2012-04-17 15:06:33 作者: rapoo

为什么说MFC程序里面不要调用_beginthreadex()?
网上都这么说。

然后网上又说MFC的AfxBeginThread实际上也是调用_beginthreadex()来创建线程的。

那么为什么规定MFC的程序不要去直接调用_beginthreadex()呢?

很疑惑啊,各位解释解释。

[解决办法]

C/C++ code
CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,    int nPriority, UINT nStackSize, DWORD dwCreateFlags,    LPSECURITY_ATTRIBUTES lpSecurityAttrs){#ifndef _MT    pfnThreadProc;    pParam;    nPriority;    nStackSize;    dwCreateFlags;    lpSecurityAttrs;    return NULL;#else    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;#endif //!_MT)}BOOL CWinThread::CreateThread(DWORD dwCreateFlags, UINT nStackSize,    LPSECURITY_ATTRIBUTES lpSecurityAttrs){#ifndef _MT    dwCreateFlags;    nStackSize;    lpSecurityAttrs;    return FALSE;#else    ASSERT(m_hThread == NULL);  // already created?    // setup startup structure for thread initialization    _AFX_THREAD_STARTUP startup; memset(&startup, 0, sizeof(startup));    startup.pThreadState = AfxGetThreadState();    startup.pThread = this;    startup.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);    startup.hEvent2 = ::CreateEvent(NULL, TRUE, FALSE, NULL);    startup.dwCreateFlags = dwCreateFlags;    if (startup.hEvent == NULL || startup.hEvent2 == NULL)    {        TRACE0("Warning: CreateEvent failed in CWinThread::CreateThread.\n");        if (startup.hEvent != NULL)            ::CloseHandle(startup.hEvent);        if (startup.hEvent2 != NULL)            ::CloseHandle(startup.hEvent2);        return FALSE;    }    // create the thread (it may or may not start to run)    m_hThread = (HANDLE)_beginthreadex(lpSecurityAttrs, nStackSize,        &_AfxThreadEntry, &startup, dwCreateFlags | CREATE_SUSPENDED, (UINT*)&m_nThreadID);    if (m_hThread == NULL)        return FALSE;    // start the thread just for MFC initialization    VERIFY(ResumeThread() != (DWORD)-1);    VERIFY(::WaitForSingleObject(startup.hEvent, INFINITE) == WAIT_OBJECT_0);    ::CloseHandle(startup.hEvent);    // if created suspended, suspend it until resume thread wakes it up    if (dwCreateFlags & CREATE_SUSPENDED)        VERIFY(::SuspendThread(m_hThread) != (DWORD)-1);    // if error during startup, shut things down    if (startup.bError)    {        VERIFY(::WaitForSingleObject(m_hThread, INFINITE) == WAIT_OBJECT_0);        ::CloseHandle(m_hThread);        m_hThread = NULL;        ::CloseHandle(startup.hEvent2);        return FALSE;    }    // allow thread to continue, once resumed (it may already be resumed)    ::SetEvent(startup.hEvent2);    return TRUE;#endif //!_MT}
[解决办法]
这个没有什么吧,最好不要使用CreateThread来创建
[解决办法]
似乎在调用哪个begin的时候初始化了一些东西。

读书人网 >VC/MFC

热点推荐