锘??xml version="1.0" encoding="utf-8" standalone="yes"?> CWinThread* AfxBeginThread( 鍙傛暟璇存槑: pThreadClass:鎸囧悜浠嶤WinThread媧劇敓鐨勫瓙綾誨璞$殑RUNTIME_CLASS pParam:瑕佷紶閫掔粰綰跨▼鍑芥暟鐨勫弬鏁?/p>
nPriority:瑕佸惎鍔ㄧ殑綰跨▼鐨勪紭鍏堢駭,榛樿浼樺厛綰т負THREAD_PRIORITY_NORMAL(鏅氫紭鍏堢駭),鍏充簬綰跨▼ nStackSize:鏂扮嚎紼嬬殑鍫嗘爤澶у皬,濡傛灉璁劇疆涓?,鍒欎嬌鐢ㄩ粯璁ゅぇ灝?鍦ㄥ簲鐢ㄧ▼搴忎腑涓鑸儏鍐典笅綰跨▼鐨勯粯璁ゅ爢鏍堝ぇ灝?br> 涓?M dwCreateFlags:綰跨▼鍒涘緩鏍囧織,璇ュ弬鏁板彲浠ユ寚瀹氫負涓嬪垪鏍囧織 涓婇潰灝辨槸AfxBeginThread鍑芥暟鐨勭畝鍗曡鏄?鎴戜滑鍦ㄤ嬌鐢ㄧ殑鏃跺欎竴鑸儏鍐典笅鍙鎸囧畾鍓嶄袱涓弬鏁?鍏朵粬 涓嬮潰鎴戜滑灝辨潵鐪嬩竴涓婣fxBeginThread鍑芥暟鐨勫唴閮ㄥ疄鐜?/p>
//鍚姩worker綰跨▼ return NULL; CWinThread* pThread = DEBUG_NEW CWinThread(pfnThreadProc, pParam); if (!pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize, return pThread; //鍚姩UI綰跨▼ return NULL; CWinThread* pThread = (CWinThread*)pThreadClass->CreateObject(); pThread->m_pThreadParams = NULL; return pThread; 浠庝笂闈㈢殑浠g爜涓彲浠ョ湅鍑篈fxBeginThread鎵鍋氱殑浜嬫儏涓昏鏈変互涓嬪嚑鐐? 1.鍦╤eap涓厤緗竴涓柊鐨凜WinThread瀵硅薄(worker綰跨▼) 2.璋冪敤CWinThread::CreateThread()騫惰瀹氬睘鎬?浣跨嚎紼嬩互鎸傝搗鐘舵佷駭鐢?br>pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize,lpSecurityAttrs); 3.璁懼畾綰跨▼鐨勪紭鍏堟潈 4.璋冪敤CWinThread::ResumeThread
銆銆姣忎竴涓繘紼嬭嚦灝戞湁涓涓富鎵ц綰跨▼錛屽畠鏃犻渶鐢辯敤鎴峰幓涓誨姩鍒涘緩錛屾槸鐢辯郴緇熻嚜鍔ㄥ垱寤虹殑銆傜敤鎴鋒牴鎹渶瑕佸湪搴旂敤紼嬪簭涓垱寤哄叾瀹冪嚎紼嬶紝澶氫釜綰跨▼騫跺彂鍦拌繍琛屼簬鍚屼竴涓繘紼嬩腑銆備竴涓繘紼嬩腑鐨勬墍鏈夌嚎紼嬮兘鍦ㄨ榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿涓紝鍏卞悓浣跨敤榪欎簺铏氭嫙鍦板潃絀洪棿銆佸叏灞鍙橀噺鍜岀郴緇熻祫婧愶紝鎵浠ョ嚎紼嬮棿鐨勯氳闈炲父鏂逛究錛屽綰跨▼鎶鏈殑搴旂敤涔熻緝涓哄箍娉涖?nbsp; 闃呰鍏ㄦ枃
]]>
鍑芥暟鍘熷瀷錛?br>CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority =
THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES
lpSecurityAttrs = NULL );
CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
榪斿洖鍊鹼細
鎸囧悜鏂板垱寤虹殑綰跨▼瀵硅薄銆?br>
鍙傛暟錛?br>pfnThreadProc錛氬伐浣滅嚎紼嬬殑鍑芥暟鎸囬拡錛屼笉鍙互涓虹┖銆傚茍涓斿伐浣滅嚎紼嬬殑鍑芥暟蹇呴』濡傛澹版槑錛?br> UINT MyControllingFunction( LPVOID pParam );
pThreadClass錛?浠嶤WinThread綾葷戶鎵挎潵鐨勫璞$殑RUNTIME_CLASS鎸囬拡銆?br>pParam:銆銆銆銆浼犻掔粰宸ヤ綔綰跨▼鍑芥暟pfnThreadProc鐨勫弬鏁般?br>nPriority錛氥銆綰跨▼鐨勪紭鍏堢駭銆傚鏋滀負0錛屽垯涓庡垱寤哄畠鐨勭嚎紼嬩紭鍏堢駭鐩稿悓銆傚彲浠ラ氳繃鍙傝僕in32 Programmer’s
Reference涓殑SetThreadPriority寰楀埌鎵鏈夊彲鐢ㄧ殑浼樺厛綰у垪琛ㄥ拰鎻忚堪銆?br>nStackSize錛氥 浠ュ瓧鑺備負鍗曚綅鎸囧畾鏂扮嚎紼嬬殑鍫嗘爤澶у皬銆傚鏋滀負0錛屽垯涓庡垱寤哄畠鐨勭嚎紼嬬殑鍫嗘爤澶у皬鐩稿悓銆?br>dwCreateFlags錛氭寚瀹氫竴涓澶栫殑鏍囧織鎺у埗綰跨▼鐨勪駭鐢熴傚畠鍙互鍖呮嫭涓嬮潰涓や釜鍊間腑鐨勪竴涓細
銆銆銆銆銆銆銆 CREATE_SUSPENDED錛氫互鎸傝搗妯″紡寮濮嬬嚎紼嬶紝騫朵笖鎸囧畾鎸傝搗嬈℃暟.褰撹皟鐢≧esumeThread鏃訛紝榪欎釜
綰跨▼鎵嶄細琚墽琛屻?br> 0 銆銆銆銆銆錛氬垱寤轟箣鍚庯紝椹笂鎵ц綰跨▼銆?br>lpSecurityAttrs錛氭寚鍚慡ECURITY_ATTRIBUTES緇撴瀯鐨勬寚閽堬紝緇撴瀯涓寚瀹氫簡綰跨▼鐨勫畨鍏ㄥ睘鎬с傚鏋滀負NULL錛屽垯涓?nbsp;
鍒涘緩瀹冪殑綰跨▼鐨勫畨鍏ㄥ睘鎬х浉鍚屻傚鏋滃笇鏈涘緱鍒版洿澶氱殑鏈夊叧SECURITY_ATTRIBUTES緇撴瀯鐨勪俊鎭?
璇峰弬鑰僕in32 Programmer’s Reference銆?br>娉ㄩ噴錛?br>璋冪敤榪欎釜鍑芥暟鍒涘緩涓涓柊鐨勭嚎紼嬨傜涓縐嶅艦寮忕殑AfxBeginThread鍒涘緩涓涓伐浣滅嚎紼嬶紱絎簩縐嶅艦寮忓垱寤轟竴涓敤鎴?br>鎺ュ彛綰跨▼銆?br>AfxBeginThread鍒涘緩涓涓柊鐨凜WinThread瀵硅薄,璋冪敤瀹冪殑CreateThread鍑芥暟寮濮嬫墽琛岀嚎紼嬪茍涓旇繑鍥炴寚鍚戠嚎紼嬬殑鎸?br>閽堛侰hecks are made throughout the procedure to make sure all objects are deallocated properly
should any part of the creation fail. 緇堟綰跨▼錛屽彲浠ュ湪綰跨▼鍑芥暟涓皟鐢ˋfxEndThread, 鎴栬呬粠宸ヤ綔綰跨▼
鐨勫嚱鏁頒腑榪斿洖銆?br>浜嗚В鏇村鐨勬湁鍏矨fxBeginThread鐨勪俊鎭紝鍙互鍙傝冩枃绔犮Multithreading: Creating Worker Threads 鍜?
Multithreading: Creating User-Interface Threads in Visual C++ Programmer’s Guide.
鍙傜湅錛欰fxGetThread
紺轟緥錛?br> 鍒涘緩涓涓伐浣滅嚎紼嬶細
UINT WorkForce(LPVOID lpParameter);//綰跨▼鍑芥暟澹版槑
CWinThread *pMyFirstWorker錛?pMySecondWorker;
LPVOID pParam = NULL;
int nPriority = THREAD_PRIORITY_ABOVE_NORMAL;//榛樿涓篢HREAD_PRIORITY_NORMAL
UINT nStackSize = 0;//涓庡垱寤哄畠鐨勭嚎紼嬪爢鏍堝ぇ灝忕浉鍚?br>DWORD dwCreateFlags = 0;//鍒涘緩鍚庣珛鍗蟲墽琛?br>LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ;//涓庡垱寤哄畠鐨勭嚎紼嬪畨鍏ㄥ睘鎬х浉鍚?br>
pMyFirstWorker=AfxBeginThread( (AFX_THREADPROC)WorkForce, pParam, nPriority , nStackSize,
dwCreateFlags , lpSecurityAttrs);
pMySecondWorker=AfxBeginThread( (AFX_THREADPROC)WorkForce, pParam);//濡傛灉閲囩敤榛樿鍊?br>
DWORD WINAPI WorkForce( LPVOID lpParameter // 綰跨▼鎵闇鍙傛暟錛屽彲浠ラ氳繃瀹冧紶閫掓暟鎹?
{
return 0;//浠涔堜笉鍋?br>}
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
pfnThreadProc:綰跨▼鍑芥暟鐨勫湴鍧,璇ュ弬鏁頒笉鑳借緗負NULL,綰跨▼鍑芥暟蹇呴』瀹氫箟鎴愬叏灞鍑芥暟鎴栬呯被鐨勯潤鎬佹垚鍛樺嚱鏁?br>渚嬪:
UINT myThreadFunc(LPVOID lparam)
鎴栬?br>class A
{
public:
static UINT __stdcall myThreadFunc(LPVOID lparam);
}
涔嬫墍浠ヨ瀹氫箟鎴愮被鐨勯潤鎬佹垚鍛樺嚱鏁?鏄洜涓虹被鐨勯潤鎬佹垚鍛樺嚱鏁頒笉灞炰簬鏌愪釜綾誨璞?榪欐牱鍦ㄨ皟鐢ㄥ嚱鏁?br>鐨勬椂鍊欏氨涓嶇敤浼犻掍竴涓澶栫殑this鎸囬拡.
浼樺厛綰х殑璇︾粏璇存槑璇峰弬鑰働latform SDK SetThreadPriority鍑芥暟璇存槑
CREATE_SUSPENDED:浠ユ寕璧鋒柟寮忓惎鍔ㄧ嚎紼?濡傛灉浣犲湪綰跨▼鍚姩涔嬪墠鎯沖垵濮嬪寲涓浜汣WinThread綾諱腑鐨勪竴浜涙垚鍛樺彉閲?br> 姣斿:m_bAutoDelete鎴栬呬綘鐨勬淳鐢熺被涓殑鎴愬憳鍙橀噺,褰撳垵濮嬪寲瀹屾垚涔嬪悗,浣犲彲浠ヤ嬌鐢–WinThread綾葷殑ResumeThread
鎴愬憳鍑芥暟鏉ユ仮澶嶇嚎紼嬬殑榪愯
濡傛灉鎶婅鏍囧織璁劇疆涓?,鍒欒〃紺虹珛鍗沖惎鍔ㄧ嚎紼?br>lpSecurityAttrs:鎸囧悜瀹夊叏鎻忚堪絎︾殑鎸囬拡,濡傛灉浣跨敤榛樿鐨勫畨鍏ㄧ駭鍒彧瑕佽璇ュ弬鏁拌緗負NULL灝卞彲浠ヤ簡!
鍙傛暟浣跨敤榛樿鍊煎氨鍙互.鍡?鐨勭‘,浣跨敤璧鋒潵鏄緢綆鍗?鍙榪欎釜鍑芥暟涓琚皟鐢?灝卞垱寤轟簡涓涓嚎紼?
浣嗘槸澶у鏈夋病鏈夋兂榪?AfxBeginThread鍑芥暟絀剁珶鏄浣曞惎鍔ㄧ殑綰跨▼鍛?瀹冪殑鍐呴儴鏄浣曞疄鐜扮殑鍛?
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;
#else
ASSERT(pfnThreadProc != NULL);
ASSERT_VALID(pThread);
lpSecurityAttrs))
{
pThread->Delete();
return NULL;
}
VERIFY(pThread->SetThreadPriority(nPriority));
if (!(dwCreateFlags & CREATE_SUSPENDED))
VERIFY(pThread->ResumeThread() != (DWORD)-1);
#endif //!_MT)
}
CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,
int nPriority, UINT nStackSize, DWORD dwCreateFlags,
LPSECURITY_ATTRIBUTES lpSecurityAttrs)
{
#ifndef _MT
pThreadClass;
nPriority;
nStackSize;
dwCreateFlags;
lpSecurityAttrs;
#else
ASSERT(pThreadClass != NULL);
ASSERT(pThreadClass->IsDerivedFrom(RUNTIME_CLASS(CWinThread)));
if (pThread == NULL)
AfxThrowMemoryException();
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);
#endif //!_MT
}
浠g爜濡?CWinThread* pThread = DEBUG_NEW CWinThread(pfnThreadProc, pParam);
璋冪敤CRuntimeClass緇撴瀯涓殑CreateObject鍑芥暟鍒涘緩CWinThread瀵硅薄
CWinThread* pThread = (CWinThread*)pThreadClass->CreateObject();
CRuntimeClass浠ュ強MFC鐩稿叧綾葷殑鍐呴儴瀹炵幇,璇︽儏璇峰弬鑰?br>銆婃繁鍏ユ祬鍑篗FC銆嬩警鎹瘋憲
pThread->SetThreadPriority(nPriority);
pThread->ResumeThread();
閫氳繃涓婇潰鐨勮鏄?鎴戞兂澶у瀵硅鍑芥暟鍒板簳鍦ㄥ唴閮ㄩ兘鍋氫簡浠涔?搴旇鏈変竴涓垵姝ョ殑浜嗚В浜?
]]>
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UNT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);//鐢ㄤ簬鍒涘緩宸ヤ綔鑰呯嚎紼?/font>
榪斿洖鍊? 涓涓寚鍚戞柊綰跨▼鐨勭嚎紼嬪璞?br>pfnThreadProc : 綰跨▼鐨勫叆鍙e嚱鏁?澹版槑涓瀹氳濡備笅: UINT MyThreadFunction( LPVOID pParam );
pParam : 浼犻掑叆綰跨▼鐨勫弬鏁?娉ㄦ剰瀹冪殑綾誨瀷涓?LPVOID,鎵浠ユ垜浠彲浠ヤ紶閫掍竴涓粨鏋勪綋鍏ョ嚎紼?
nPriority : 綰跨▼鐨勪紭鍏堢駭,涓鑸緗負 0 .璁╁畠鍜屼富綰跨▼鍏鋒湁鍏卞悓鐨勪紭鍏堢駭.
nStackSize : 鎸囧畾鏂板垱寤虹殑綰跨▼鐨勬爤鐨勫ぇ灝?濡傛灉涓?0,鏂板垱寤虹殑綰跨▼鍏鋒湁鍜屼富綰跨▼涓鏍風殑澶у皬鐨勬爤
dwCreateFlags : 鎸囧畾鍒涘緩綰跨▼浠ュ悗,綰跨▼鏈夋庝箞鏍風殑鏍囧織.鍙互鎸囧畾涓や釜鍊?
CREATE_SUSPENDED : 綰跨▼鍒涘緩浠ュ悗,浼氬浜庢寕璧風姸鎬?鐪熷埌璋冪敤: ResumeThread
0 : 鍒涘緩綰跨▼鍚庡氨寮濮嬭繍琛?
lpSecurityAttrs : 鎸囧悜涓涓?SECURITY_ATTRIBUTES 鐨勭粨鏋勪綋,鐢ㄥ畠鏉ユ爣蹇楁柊鍒涘緩綰跨▼鐨勫畨鍏ㄦ?濡傛灉涓?NULL ,
閭d箞鏂板垱寤虹殑綰跨▼灝卞叿鏈夊拰涓葷嚎紼嬩竴鏍風殑瀹夊叏鎬?
濡傛灉瑕佸湪綰跨▼鍐呯粨鏉熺嚎紼?鍙互鍦ㄧ嚎紼嬪唴璋冪敤 AfxEndThread.
緇撴潫綰跨▼鐨勪袱縐嶆柟寮?br> 褰撲綘鍦ㄥ悗鍙扮敤綰跨▼鏉ユ墦鍗頒竴浜涘浘褰㈡椂.鏈夋椂鍦ㄦ墦鍗頒竴閮ㄥ垎鍚?浣犲笇鏈涘彲浠ュ仠涓嬫潵,閭d箞姝ゅ浣曡綰跨▼鍋滄鍛?涓?/font>
闈細璇︾粏鐨勫悜浣犺В閲婅緇撴潫綰跨▼鐨勪袱縐嶆柟寮?br> 1 : 榪欐槸鏈綆鍗曠殑鏂瑰紡,涔熷氨鏄綰跨▼鍑芥暟鎵ц瀹屾垚,姝ゆ椂綰跨▼姝e父緇撴潫.瀹冧細榪斿洖涓涓?涓鑸?鏄垚鍔熺粨鏉?
褰撶劧浣犲彲浠ュ畾涔夎嚜宸辯殑璁や負鍚堥傜殑鍊兼潵浠h〃綰跨▼鎴愬姛鎵ц.鍦ㄧ嚎紼嬪唴璋冪敤AfxEndThread灝嗕細鐩存帴緇撴潫綰跨▼,姝ゆ椂綰?/font>
紼嬬殑涓鍒囪祫婧愰兘浼氳鍥炴敹.
2 : 濡傛灉浣犳兂璁╁埆涓涓嚎紼婤鏉ョ粨鏉熺嚎紼婣,閭d箞,浣犲氨闇瑕佸湪榪欎袱涓嚎紼嬩腑浼犻掍俊鎭?
涓嶇鏄伐浣滆呯嚎紼嬭繕鏄晫闈㈢嚎紼?濡傛灉浣犳兂鍦ㄧ嚎紼嬬粨鏉熷悗寰楀埌瀹冪殑紜粨鏋?閭d箞浣犲彲浠ヨ皟鐢?
::GetExitCodeThread鍑芥暟