我還是一個C++ MFC初學者,在試驗書本上的例子,這里遇到一個問題想請教一下前輩

MFC多執行緒開發,用到afxbeginthread創建作業執行緒AfxBeginThread(ThreadProc, pParam),顯然使可以傳入LPVOID型別的引數pParam。
但創建用戶界面執行緒,AfxBeginThread(RUNTIME_CLASS(CChatThread)),使用RUNTIME_CLASS傳人一個CWinThread物件,這里沒有傳人LPVOID引數,需要傳入執行緒引數應該怎么辦呢?
uj5u.com熱心網友回復:
怕麻煩就用全域變數傳引數uj5u.com熱心網友回復:
謝謝了,全域變數是個方法,還是了解一下怎么傳引數給這種界面執行緒uj5u.com熱心網友回復:
這個引數是給執行緒入口函式用的,但AfxBeginThread(RUNTIME_CLASS(CChatThread))這個形式的時候,不會由你提供,你可以跟蹤進去thrdcore.cpp看看其實作,最終是由CWinThread定義了一個區域的結構作為引數傳給_beginthreadex函式;
BOOL CWinThread::CreateThread(DWORD dwCreateFlags, UINT nStackSize,
LPSECURITY_ATTRIBUTES lpSecurityAttrs)
{
#ifndef _MT
dwCreateFlags;
nStackSize;
lpSecurityAttrs;
return FALSE;
#else
ENSURE(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)
{
TRACE(traceAppMsg, 0, "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)(ULONG_PTR)_beginthreadex(lpSecurityAttrs, nStackSize,
&_AfxThreadEntry, &startup, dwCreateFlags | CREATE_SUSPENDED, (UINT*)&m_nThreadID);
if (m_hThread == NULL)
{
::CloseHandle(startup.hEvent);
::CloseHandle(startup.hEvent2);
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)
VERIFY(::SetEvent(startup.hEvent2));
return TRUE;
#endif //!_MT
}
從執行緒自身角度來看,如果它需要一些外部環境的資訊,任何能拿到資料的方式都可以,并非只能在創建時通過執行緒入口函式提供。
用戶界面執行緒有自己的訊息泵,所以你可以在執行緒創建后通過發訊息給這個執行緒來提供環境資料、互動指令等等。
uj5u.com熱心網友回復:
C++中全域變數不是好的辦法,因為1、有一些固有的缺陷;2、同時有其他好的替換方法。不過一般公司也沒有多高的質量要求,所以也可以將就。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/248268.html
標籤:進程/線程/DLL
上一篇:QT5.9.6與tslib1.4移植出錯libs.tslib未找到問題
下一篇:VBA 可見單元格行數獲取問題
