锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓銆?瀹炵幇鏂規硶
1銆佺悊瑙g嚎紼?br>
瑕佽瑙g嚎紼嬶紝涓嶅緱涓嶈涓涓嬭繘紼嬶紝榪涚▼鏄簲鐢ㄧ▼搴忕殑鎵ц瀹炰緥錛屾瘡涓繘紼嬫槸鐢辯鏈夌殑铏氭嫙鍦板潃絀洪棿銆佷唬鐮併佹暟鎹拰鍏跺畠緋葷粺璧勬簮緇勬垚銆傝繘紼嬪湪榪愯鏃跺垱寤虹殑璧勬簮
闅忕潃榪涚▼鐨勭粓姝㈣屾浜°傜嚎紼嬬殑鍩烘湰鎬濇兂寰堢畝鍗曪紝瀹冩槸涓涓嫭绔嬬殑鎵ц嫻侊紝鏄繘紼嬪唴閮ㄧ殑涓涓嫭绔嬬殑鎵ц鍗曞厓錛岀浉褰撲簬涓涓瓙紼嬪簭錛屽畠瀵瑰簲浜嶸isual
C++涓殑CwinThread綾誨璞°傚崟鐙竴涓墽琛岀▼搴忚繍琛屾椂錛岀己鐪佸湴鍖呭惈鐨勪竴涓富綰跨▼錛屼富綰跨▼浠ュ嚱鏁板湴鍧鐨勫艦寮忓嚭鐜幫紝鎻愪緵紼嬪簭鐨勫惎鍔ㄧ偣錛屽main
錛堬級鎴朩inMain錛堬級鍑芥暟絳夈傚綋涓葷嚎紼嬬粓姝㈡椂錛岃繘紼嬩篃闅忎箣緇堟銆傛牴鎹疄闄呴渶瑕侊紝搴旂敤紼嬪簭鍙互鍒嗚В鎴愯澶氱嫭绔嬫墽琛岀殑綰跨▼錛屾瘡涓嚎紼嬪茍琛岀殑榪愯鍦ㄥ悓涓榪涚▼
涓?br>
涓涓繘紼嬩腑鐨勬墍鏈夌嚎紼嬮兘鍦ㄨ榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿涓紝浣跨敤璇ヨ繘紼嬬殑鍏ㄥ眬鍙橀噺鍜岀郴緇熻祫婧愩傛搷浣滅郴緇熺粰姣忎釜綰跨▼鍒嗛厤涓嶅悓鐨凜PU鏃墮棿鐗囷紝鍦ㄦ煇涓涓椂鍒伙紝
CPU鍙墽琛屼竴涓椂闂寸墖鍐呯殑綰跨▼錛屽涓椂闂寸墖涓殑鐩稿簲綰跨▼鍦–PU鍐呰疆嫻佹墽琛岋紝鐢變簬姣忎釜鏃墮棿鐗囨椂闂村緢鐭紝鎵浠ュ鐢ㄦ埛鏉ヨ錛屼豢浣涘悇涓嚎紼嬪湪璁$畻鏈轟腑鏄茍琛屽
鐞嗙殑銆傛搷浣滅郴緇熸槸鏍規嵁綰跨▼鐨勪紭鍏堢駭鏉ュ畨鎺扖PU鐨勬椂闂達紝浼樺厛綰ч珮鐨勭嚎紼嬩紭鍏堣繍琛岋紝浼樺厛綰т綆鐨勭嚎紼嬪垯緇х畫絳夊緟銆?br>
綰跨▼琚垎涓轟袱縐嶏細鐢ㄦ埛鐣岄潰綰跨▼鍜屽伐浣滅嚎紼嬶紙鍙堢О涓哄悗鍙扮嚎紼嬶級銆傜敤鎴風晫闈㈢嚎紼嬮氬父鐢ㄦ潵澶勭悊鐢ㄦ埛鐨勮緭鍏ュ茍鍝嶅簲鍚勭浜嬩歡鍜屾秷鎭紝鍏跺疄錛屽簲鐢ㄧ▼搴忕殑涓繪墽琛岀嚎紼?
CWinAPP瀵硅薄灝辨槸涓涓敤鎴風晫闈㈢嚎紼嬶紝褰撳簲鐢ㄧ▼搴忓惎鍔ㄦ椂鑷姩鍒涘緩鍜屽惎鍔紝鍚屾牱瀹冪殑緇堟涔熸剰鍛崇潃璇ョ▼搴忕殑緇撴潫錛岃繘紼嬬粓姝€傚伐浣滅嚎紼嬬敤鏉ユ墽琛岀▼搴忕殑鍚庡彴澶?
鐞嗕換鍔★紝姣斿璁$畻銆佽皟搴︺佸涓插彛鐨勮鍐欐搷浣滅瓑錛屽畠鍜岀敤鎴風晫闈㈢嚎紼嬬殑鍖哄埆鏄畠涓嶇敤浠嶤WinThread綾繪淳鐢熸潵鍒涘緩錛屽瀹冩潵璇存渶閲嶈鐨勬槸濡備綍瀹炵幇宸ヤ綔綰跨▼
浠誨姟鐨勮繍琛屾帶鍒跺嚱鏁般傚伐浣滅嚎紼嬪拰鐢ㄦ埛鐣岄潰綰跨▼鍚姩鏃惰璋冪敤鍚屼竴涓嚱鏁扮殑涓嶅悓鐗堟湰錛涙渶鍚庨渶瑕佽鑰呮槑鐧界殑鏄紝涓涓繘紼嬩腑鐨勬墍鏈夌嚎紼嬪叡浜畠浠埗榪涚▼鐨勫彉閲忥紝浣嗗悓
鏃舵瘡涓嚎紼嬪彲浠ユ嫢鏈夎嚜宸辯殑鍙橀噺銆?
2銆佺嚎紼嬬殑綆$悊鍜屾搷浣?br>
錛堜竴錛夌嚎紼嬬殑鍚姩
鍒涘緩涓涓敤鎴風晫闈㈢嚎紼嬶紝棣栧厛瑕佷粠綾籆winThread浜х敓涓涓淳鐢熺被錛屽悓鏃跺繀欏諱嬌鐢―ECLARE_DYNCREATE鍜?
IMPLEMENT_DYNCREATE鏉ュ0鏄庡拰瀹炵幇榪欎釜CwinThread媧劇敓綾匯傜浜屾鏄牴鎹渶瑕侀噸杞借媧劇敓綾葷殑涓浜涙垚鍛樺嚱鏁板錛?
ExitInstance錛堬級銆両nitInstance錛堬級銆丱nIdle錛堬級銆丳reTranslateMessage錛堬級絳夊嚱鏁般傛渶鍚庤皟鐢?
AfxBeginThread()鍑芥暟鐨勪竴涓増鏈細CWinThread* AfxBeginThread( CRuntimeClass*
pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize =
0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs =
NULL )
鍚姩璇ョ敤鎴風晫闈㈢嚎紼嬶紝鍏朵腑絎竴涓弬鏁頒負鎸囧悜瀹氫箟鐨勭敤鎴風晫闈㈢嚎紼嬬被鎸囬拡鍙橀噺錛岀浜屼釜鍙傛暟涓虹嚎紼嬬殑浼樺厛綰э紝絎笁涓弬鏁頒負綰跨▼鎵瀵瑰簲鐨勫爢鏍堝ぇ灝忥紝絎洓涓弬鏁頒負綰?
紼嬪垱寤烘椂鐨勯檮鍔犳爣蹇楋紝緙虹渷涓烘甯哥姸鎬侊紝濡備負CREATE_SUSPENDED鍒欑嚎紼嬪惎鍔ㄥ悗涓烘寕璧風姸鎬併?br>
瀵逛簬宸ヤ綔綰跨▼鏉ヨ錛屽惎鍔ㄤ竴涓嚎紼嬶紝棣栧厛闇瑕佺紪鍐欎竴涓笇鏈涗笌搴旂敤紼嬪簭鐨勫叾浣欓儴鍒嗗茍琛岃繍琛岀殑鍑芥暟濡侳un1()錛屾帴鐫瀹氫箟涓涓寚鍚慍winThread瀵?
璞$殑鎸囬拡鍙橀噺*pThread,璋冪敤AfxBeginThread(Fun1,param,priority)鍑芥暟錛岃繑鍥炲艱祴緇檖Thread鍙橀噺鐨勫悓鏃?
涓騫跺惎鍔ㄨ綰跨▼鏉ユ墽琛屼笂闈㈢殑Fun1錛堬級鍑芥暟錛屽叾涓璅un1鏄嚎紼嬭榪愯鐨勫嚱鏁扮殑鍚嶅瓧錛屼篃鏃㈡槸涓婇潰鎵璇寸殑鎺у埗鍑芥暟鐨勫悕瀛楋紝param鏄噯澶囦紶閫佺粰綰跨▼鍑芥暟
Fun1鐨勪換鎰?2浣嶅鹼紝priority鍒欐槸瀹氫箟璇ョ嚎紼嬬殑浼樺厛綰у埆錛屽畠鏄瀹氫箟鐨勫父鏁幫紝璇昏呭彲鍙傝僊SDN銆?br>
錛堜簩錛夌嚎紼嬬殑浼樺厛綰?br>
浠ヤ笅鐨凜winThread綾葷殑鎴愬憳鍑芥暟鐢ㄤ簬綰跨▼浼樺厛綰х殑鎿嶄綔錛?br>
////////////////////////////////////////////////////////////////
//////CtestView message handlers
/////Set to True to end thread
Bool bend=FALSE;//瀹氫箟鐨勫叏灞鍙橀噺錛岀敤浜庢帶鍒剁嚎紼嬬殑榪愯錛?br>
//The Thread Function錛?br>
UINT ThreadFunction(LPVOID pParam)//綰跨▼鍑芥暟
{
while(!bend)
{
Beep(100,100);
Sleep(1000);
}
return 0;
}
/////////////////////////////////////////////////////////////
CwinThread *pThread;
HWND hWnd;
Void CtestView::OninitialUpdate()
{
hWnd=GetSafeHwnd();
pThread=AfxBeginThread(ThradFunction,hWnd);//鍚姩綰跨▼
pThread->m_bAutoDelete=FALSE;//綰跨▼涓烘墜鍔ㄥ垹闄?br>
Cview::OnInitialUpdate();
}
////////////////////////////////////////////////////////////////
Void CtestView::OnDestroy()
{
bend=TRUE;//鏀瑰彉鍙橀噺錛岀嚎紼嬬粨鏉?br>
WaitForSingleObject(pThread->m_hThread,INFINITE);//絳夊緟綰跨▼緇撴潫
delete pThread;//鍒犻櫎綰跨▼
Cview::OnDestroy();
}
銆銆3銆佺嚎紼嬩箣闂寸殑閫氫俊
閫氬父鎯呭喌涓嬶紝涓涓綰х嚎紼嬭涓轟富綰跨▼瀹屾垚鏌愮鐗瑰畾綾誨瀷鐨勪換鍔★紝榪欏氨闅愬惈鐫琛ㄧず鍦ㄤ富綰跨▼鍜屾綰х嚎紼嬩箣闂撮渶瑕佸緩绔嬩竴涓氫俊鐨勯氶亾銆備竴鑸儏鍐典笅錛屾湁涓嬮潰鐨勫嚑
縐嶆柟娉曞疄鐜拌繖縐嶉氫俊浠誨姟錛氫嬌鐢ㄥ叏灞鍙橀噺錛堜笂涓鑺傜殑渚嬪瓙鍏跺疄浣跨敤鐨勫氨鏄繖縐嶆柟娉曪級銆佷嬌鐢ㄤ簨浠跺璞°佷嬌鐢ㄦ秷鎭傝繖閲屾垜浠富瑕佷粙緇嶅悗涓ょ鏂規硶銆?br>
錛堜竴錛?鍒╃敤鐢ㄦ埛瀹氫箟鐨勬秷鎭氫俊
鍦╓indows紼嬪簭璁捐涓紝搴旂敤紼嬪簭鐨勬瘡涓涓嚎紼嬮兘鎷ユ湁鑷繁鐨勬秷鎭槦鍒楋紝鐢氳嚦宸ヤ綔綰跨▼涔熶笉渚嬪錛岃繖鏍蜂竴鏉ワ紝灝變嬌寰楃嚎紼嬩箣闂村埄鐢ㄦ秷鎭潵浼犻掍俊鎭氨鍙樼殑
闈炲父綆鍗曘傞鍏堢敤鎴瘋瀹氫箟涓涓敤鎴鋒秷鎭紝濡備笅鎵紺猴細#define WM_USERMSG
WMUSER+100錛涘湪闇瑕佺殑鏃跺欙紝鍦ㄤ竴涓嚎紼嬩腑璋冪敤錛氾細PostMessage((HWND)param,WM_USERMSG,0,0)鎴?
CwinThread::PostThradMessage錛堬級鏉ュ悜鍙﹀涓涓嚎紼嬪彂閫佽繖涓秷鎭紝涓婅堪鍑芥暟鐨勫洓涓弬鏁板垎鍒槸娑堟伅灝嗚鍙戦佸埌鐨勭洰鐨勭獥鍙g殑鍙?
鏌勩佽鍙戦佺殑娑堟伅鏍囧織絎︺佹秷鎭殑鍙傛暟WPARAM鍜孡PARAM銆備笅闈㈢殑浠g爜鏄涓婅妭浠g爜鐨勪慨鏀癸紝淇敼鍚庣殑緇撴灉鏄湪綰跨▼緇撴潫鏃舵樉紺轟竴涓璇濇錛屾彁紺虹嚎紼嬬粨
鏉燂細
Retrun 0;
}
銆銆涓婇潰鐨勪緥瀛愭槸宸ヤ綔鑰呯嚎紼嬪悜鐢ㄦ埛鐣岄潰綰跨▼鍙戦佹秷鎭紝瀵逛簬宸ヤ綔鑰呯嚎紼嬶紝濡傛灉瀹冪殑璁捐妯″紡涔熸槸娑堟伅椹卞姩鐨勶紝閭d箞璋冪敤鑰呭彲浠ュ悜瀹冨彂閫佸垵濮嬪寲銆侀
鍑恒佹墽琛屾煇縐嶇壒瀹氱殑澶勭悊絳夋秷鎭紝璁╁畠鍦ㄥ悗鍙板畬鎴愩傚湪鎺у埗鍑芥暟涓彲浠ョ洿鎺ヤ嬌鐢細錛欸etMessage()榪欎釜SDK鍑芥暟榪涜娑堟伅鍒嗘鍜屽鐞嗭紝鑷繁瀹炵幇涓涓?
娑堟伅寰幆銆侴etMessage()鍑芥暟鍦ㄥ垽鏂綰跨▼鐨勬秷鎭槦鍒椾負絀烘椂錛岀嚎紼嬪皢緋葷粺鍒嗛厤緇欏畠鐨勬椂闂寸墖璁╃粰鍏跺畠綰跨▼錛屼笉鏃犳晥鐨勫崰鐢–PU鐨勬椂闂達紝濡傛灉娑堟伅闃?
鍒椾笉涓虹┖錛屽氨鑾峰彇榪欎釜娑堟伅錛屽垽鏂繖涓秷鎭殑鍐呭騫惰繘琛岀浉搴旂殑澶勭悊銆?br>
錛堜簩錛夌敤浜嬩歡瀵硅薄瀹炵幇閫氫俊
鍦ㄧ嚎紼嬩箣闂翠紶閫掍俊鍙瘋繘琛岄氫俊姣旇緝澶嶆潅鐨勬柟娉曟槸浣跨敤浜嬩歡瀵硅薄錛岀敤MFC鐨凜event綾葷殑瀵硅薄鏉ヨ〃紺恒備簨浠跺璞″浜庝袱縐嶇姸鎬佷箣涓錛氭湁淇″彿鍜屾棤淇″彿錛岀嚎紼嬪彲浠ョ洃瑙嗗浜庢湁淇″彿鐘舵佺殑浜嬩歡錛屼互渚垮湪閫傚綋鐨勬椂鍊欐墽琛屽浜嬩歡鐨勬搷浣溿備笂榪頒緥瀛愪唬鐮佷慨鏀瑰涓嬶細
while(!bend)
{
Beep(100,100);
Sleep(1000);
Int result=::WaitforSingleObject(threadEnd.m_hObject,0);
//絳夊緟threadEnd浜嬩歡鏈変俊鍙鳳紝鏃犱俊鍙鋒椂綰跨▼鍦ㄨ繖閲屾偓鍋?br>
If(result==Wait_OBJECT_0)
Bend=TRUE;
}
錛氾細PostMessage(hWnd,WM_USERMSG,0,0)錛?br>
return 0;
}
/////////////////////////////////////////////////////////////
Void CtestView::OninitialUpdate()
{
hWnd=GetSafeHwnd();
threadStart.SetEvent();//threadStart浜嬩歡鏈変俊鍙?br>
pThread=AfxBeginThread(ThreadFunction,hWnd);//鍚姩綰跨▼
pThread->m_bAutoDelete=FALSE;
Cview::OnInitialUpdate();
}
////////////////////////////////////////////////////////////////
Void CtestView::OnDestroy()
{
threadEnd.SetEvent();
WaitForSingleObject(pThread->m_hThread,INFINITE);
delete pThread;
Cview::OnDestroy();
}
銆銆榪愯榪欎釜紼嬪簭錛屽綋鍏抽棴紼嬪簭鏃訛紝鎵嶆樉紺烘彁紺烘錛屾樉紺?Thread ended"銆?
銆銆4銆佺嚎紼嬩箣闂寸殑鍚屾
鍓嶉潰鎴戜滑璁茶繃錛屽悇涓嚎紼嬪彲浠ヨ闂繘紼嬩腑鐨勫叕鍏卞彉閲忥紝鎵浠ヤ嬌鐢ㄥ綰跨▼鐨勮繃紼嬩腑闇瑕佹敞鎰忕殑闂鏄浣曢槻姝袱涓垨涓や釜浠ヤ笂鐨勭嚎紼嬪悓鏃惰闂悓涓涓暟鎹紝浠ュ厤鐮?
鍧忔暟鎹殑瀹屾暣鎬с備繚璇佸悇涓嚎紼嬪彲浠ュ湪涓璧烽傚綋鐨勫崗璋冨伐浣滅О涓虹嚎紼嬩箣闂寸殑鍚屾銆傚墠闈竴鑺備粙緇嶇殑浜嬩歡瀵硅薄瀹為檯涓婂氨鏄竴縐嶅悓姝ュ艦寮忋俈isual
C++涓嬌鐢ㄥ悓姝ョ被鏉ヨВ鍐蟲搷浣滅郴緇熺殑騫惰鎬ц屽紩璧風殑鏁版嵁涓嶅畨鍏ㄧ殑闂錛孧FC鏀寔鐨勪竷涓綰跨▼鐨勫悓姝ョ被鍙互鍒嗘垚涓ゅぇ綾伙細鍚屾瀵硅薄
錛圕syncObject銆丆semaphore銆丆mutex銆丆criticalSection鍜孋event錛夊拰鍚屾璁塊棶瀵硅薄
錛圕multiLock鍜孋singleLock錛夈傛湰鑺備富瑕佷粙緇嶄復鐣屽尯錛坈ritical
section錛夈佷簰鏂ワ紙mutexe錛夈佷俊鍙烽噺錛坰emaphore錛夛紝榪欎簺鍚屾瀵硅薄浣垮悇涓嚎紼嬪崗璋冨伐浣滐紝紼嬪簭榪愯璧鋒潵鏇村畨鍏ㄣ?br>
錛堜竴錛?涓寸晫鍖?br>
涓寸晫鍖烘槸淇濊瘉鍦ㄦ煇涓涓椂闂村彧鏈変竴涓嚎紼嬪彲浠ヨ闂暟鎹殑鏂規硶銆備嬌鐢ㄥ畠鐨勮繃紼嬩腑錛岄渶瑕佺粰鍚勪釜綰跨▼鎻愪緵涓涓叡浜殑涓寸晫鍖哄璞★紝鏃犺鍝釜綰跨▼鍗犳湁涓寸晫鍖哄璞★紝
閮藉彲浠ヨ闂彈鍒頒繚鎶ょ殑鏁版嵁錛岃繖鏃跺欏叾瀹冪殑綰跨▼闇瑕佺瓑寰咃紝鐩村埌璇ョ嚎紼嬮噴鏀句復鐣屽尯瀵硅薄涓烘錛屼復鐣屽尯琚噴鏀懼悗錛屽彟澶栫殑綰跨▼鍙互寮哄崰榪欎釜涓寸晫鍖猴紝浠ヤ究璁塊棶鍏變韓鐨勬暟
鎹備復鐣屽尯瀵瑰簲鐫涓涓狢criticalSection瀵硅薄錛屽綋綰跨▼闇瑕佽闂繚鎶ゆ暟鎹椂錛岃皟鐢ㄤ復鐣屽尯瀵硅薄鐨凩ock()鎴愬憳鍑芥暟錛涘綋瀵逛繚鎶ゆ暟鎹殑鎿嶄綔瀹屾垚
涔嬪悗錛岃皟鐢ㄤ復鐣屽尯瀵硅薄鐨刄nlock()鎴愬憳鍑芥暟閲婃斁瀵逛復鐣屽尯瀵硅薄鐨勬嫢鏈夋潈錛屼互浣垮彟涓涓嚎紼嬪彲浠ュず鍙栦復鐣屽尯瀵硅薄騫惰闂彈淇濇姢鐨勬暟鎹傚悓鏃跺惎鍔ㄤ袱涓嚎紼嬶紝瀹?
浠搴旂殑鍑芥暟鍒嗗埆涓篧riteThread()鍜孯eadThread()錛岀敤浠ュ鍏叡鏁扮粍緇刟rray[]鎿嶄綔錛屼笅闈㈢殑浠g爜璇存槑浜嗗浣曚嬌鐢ㄤ復鐣屽尯瀵硅薄錛?br>
int array[10],destarray[10];
CCriticalSection Section;
UINT WriteThread(LPVOID param)
{
Section.Lock();
for(int x=0;x<10;x++)
array[x]=x;
Section.Unlock();
}
UINT ReadThread(LPVOID param)
{
Section.Lock();
For(int x=0;x<10;x++)
Destarray[x]=array[x];
Section.Unlock();
}
銆銆涓婅堪浠g爜榪愯鐨勭粨鏋滃簲璇ユ槸Destarray鏁扮粍涓殑鍏冪礌鍒嗗埆涓?-9錛岃屼笉鏄潅涔辨棤绔犵殑鏁幫紝濡傛灉涓嶄嬌鐢ㄥ悓姝ワ紝鍒欎笉鏄繖涓粨鏋滐紝鏈夊叴瓚g殑璇昏呭彲浠ュ疄楠屼竴涓嬨?br>
錛堜簩錛変簰鏂?br>
浜掓枼涓庝復鐣屽尯寰堢浉浼鹼紝浣嗘槸浣跨敤鏃剁浉瀵瑰鏉備竴浜涳紝瀹冧笉浠呭彲浠ュ湪鍚屼竴搴旂敤紼嬪簭鐨勭嚎紼嬮棿瀹炵幇鍚屾錛岃繕鍙互鍦ㄤ笉鍚岀殑榪涚▼闂村疄鐜板悓姝ワ紝浠庤屽疄鐜拌祫婧愮殑瀹夊叏鍏變韓銆?
浜掓枼涓嶤mutex綾葷殑瀵硅薄鐩稿搴旓紝浣跨敤浜掓枼瀵硅薄鏃訛紝蹇呴』鍒涘緩涓涓狢SingleLock鎴朇MultiLock瀵硅薄錛岀敤浜庡疄闄呯殑璁塊棶鎺у埗錛屽洜涓鴻繖閲岀殑渚?
瀛愬彧澶勭悊鍗曚釜浜掓枼錛屾墍浠ユ垜浠彲浠ヤ嬌鐢–SingleLock瀵硅薄錛岃瀵硅薄鐨凩ock()鍑芥暟鐢ㄤ簬鍗犳湁浜掓枼錛孶nlock()鐢ㄤ簬閲婃斁浜掓枼銆傚疄鐜頒唬鐮佸涓嬶細
int array[10],destarray[10];
CMutex Section;
UINT WriteThread(LPVOID param)
{
CsingleLock singlelock;
singlelock (&Section);
singlelock.Lock();
for(int x=0;x<10;x++)
array[x]=x;
singlelock.Unlock();
}
UINT ReadThread(LPVOID param)
{
CsingleLock singlelock;
singlelock (&Section);
singlelock.Lock();
For(int x=0;x<10;x++)
Destarray[x]=array[x];
singlelock.Unlock();
}
銆銆錛堜笁錛変俊鍙烽噺
淇″彿閲忕殑鐢ㄦ硶鍜屼簰鏂ョ殑鐢ㄦ硶寰堢浉浼鹼紝涓嶅悓鐨勬槸瀹冨彲浠ュ悓涓鏃跺埢鍏佽澶氫釜綰跨▼璁塊棶鍚屼竴涓祫婧愶紝鍒涘緩涓涓俊鍙烽噺闇瑕佺敤Csemaphore綾誨0鏄庝竴涓璞★紝涓
鏃﹀垱寤轟簡涓涓俊鍙烽噺瀵硅薄錛屽氨鍙互鐢ㄥ畠鏉ュ璧勬簮鐨勮闂妧鏈傝瀹炵幇璁℃暟澶勭悊錛屽厛鍒涘緩涓涓狢singleLock鎴朇mltiLock瀵硅薄錛岀劧鍚庣敤璇ュ璞$殑
Lock()鍑芥暟鍑忓皯榪欎釜淇″彿閲忕殑璁℃暟鍊鹼紝Unlock()鍙嶄箣銆備笅闈㈢殑浠g爜鍒嗗埆鍚姩涓変釜綰跨▼錛屾墽琛屾椂鍚屾椂鏄劇ず浜屼釜娑堟伅妗嗭紝鐒跺悗10縐掑悗絎笁涓秷鎭鎵嶅緱
浠ユ樉紺恒?br>
return 0;
}
UINT ThreadProc2(LPVOID param)
{
CSingleLock singelLock(semaphore);
singleLock.Lock();
Sleep(10000);
::MessageBox((HWND)param,"Thread2 had access","Thread2",MB_OK);
return 0;
}
UINT ThreadProc3(LPVOID param)
{
CsingleLock singelLock(semaphore);
singleLock.Lock();
Sleep(10000);
::MessageBox((HWND)param,"Thread3 had access","Thread3",MB_OK);
return 0;
}
銆銆浜屻?緙栫▼姝ラ
1銆?鍚姩Visual C++6.0錛岀敓鎴愪竴涓?2浣嶇殑鎺у埗鍙扮▼搴忥紝灝嗚紼嬪簭鍛藉悕涓?sequence"
2銆?杈撳叆瑕佹帓緇殑鏁板瓧錛屽0鏄庡洓涓瓙綰跨▼錛?br>
3銆?杈撳叆浠g爜錛岀紪璇戣繍琛岀▼搴忋?/p>
涓夈?紼嬪簭浠g爜
#include "stdlib.h"
#include "memory.h"
HANDLE evtTerminate; //浜嬩歡淇″彿,鏍囪鏄惁鎵鏈夊瓙綰跨▼閮芥墽琛屽畬
/*
涓嬮潰浣跨敤浜嗕笁縐嶆帶鍒舵柟娉曪紝浣犲彲浠ユ敞閲婂叾涓袱縐嶏紝浣跨敤鍏朵腑涓縐嶃?br>
娉ㄦ剰淇敼鏃惰榪炲甫淇敼涓寸晫鍖篜rintResult閲岀殑鐩稿簲鎺у埗璇彞
*/
HANDLE evtPrint; //浜嬩歡淇″彿,鏍囪浜嬩歡鏄惁宸插彂鐢?br>
//CRITICAL_SECTION csPrint; //涓寸晫鍖?br>
//HANDLE mtxPrint; //浜掓枼淇″彿,濡傛湁淇″彿琛ㄦ槑宸茬粡鏈夌嚎紼嬭繘鍏ヤ復鐣屽尯騫舵嫢鏈夋淇″彿
static long ThreadCompleted = 0;
/*鐢ㄦ潵鏍囪鍥涗釜瀛愮嚎紼嬩腑宸插畬鎴愮嚎紼嬬殑涓暟,褰撲竴涓瓙綰跨▼瀹屾垚鏃跺氨瀵筎hreadCompleted榪涜鍔犱竴鎿嶄綔,
瑕佷嬌鐢↖nterlockedIncrement(long* lpAddend)鍜孖nterlockedDecrement(long*
lpAddend)榪涜鍔犲噺鎿嶄綔*/
//涓嬮潰鐨勭粨鏋勬槸鐢ㄤ簬浼犻佹帓搴忕殑鏁版嵁緇欏悇涓帓搴忓瓙綰跨▼
struct MySafeArray
{
long* data;
int iLength;
};
//鎵撳嵃姣忎竴涓嚎紼嬬殑鎺掑簭緇撴灉
void PrintResult(long* Array, int iLength, const char* HeadStr = "sort");
//鎺掑簭鍑芥暟
unsigned long __stdcall BubbleSort(void* theArray); //鍐掓場鎺掑簭
unsigned long __stdcall SelectSort(void* theArray); //閫夋嫨鎺掑簭
unsigned long __stdcall HeapSort(void* theArray); //鍫嗘帓搴?br>
unsigned long __stdcall InsertSort(void* theArray); //鎻掑叆鎺掑簭
/*浠ヤ笂鍥涗釜鍑芥暟鐨勫0鏄庡繀欏婚傚悎浣滀負涓涓嚎紼嬪嚱鏁扮殑蹇呰鏉′歡鎵嶅彲浠ヤ嬌鐢–reateThread
寤虹珛涓涓嚎紼嬨?br>
錛?錛夎皟鐢ㄦ柟娉曞繀欏繪槸__stdcall錛屽嵆鍑芥暟鍙傛暟鍘嬫爤欏哄簭鐢卞彸鍒板乏錛岃屼笖鐢卞嚱鏁版湰韜礋璐?br>
鏍堢殑鎭㈠, C鍜孋++榛樿鏄痏_cdecl, 鎵浠ヨ鏄懼紡澹版槑鏄痏_stdcall
錛?錛夎繑鍥炲煎繀欏繪槸unsigned long
錛?錛夊弬鏁板繀欏繪槸涓涓?2浣嶅鹼紝濡備竴涓寚閽堝兼垨long綾誨瀷
(4) 濡傛灉鍑芥暟鏄被鎴愬憳鍑芥暟錛屽繀欏誨0鏄庝負static鍑芥暟錛屽湪CreateThread鏃跺嚱鏁版寚閽堟湁鐗規畩鐨勫啓娉曘傚涓?鍑芥暟鏄被CThreadTest鐨勬垚鍛樺嚱鏁頒腑)錛?br>
static unsigned long _stdcall MyThreadFun(void* pParam);
handleRet = CreateThread(NULL, 0, &CThreadTestDlg::MyThreadFun, NULL, 0, &ThreadID);
涔嬫墍浠ヨ澹版槑涓簊tatic鏄敱浜庯紝璇ュ嚱鏁板繀欏昏鐙珛浜庡璞″疄渚嬫潵浣跨敤錛屽嵆浣挎病鏈夊0鏄庡疄渚嬩篃鍙互浣跨敤銆?/
int QuickSort(long* Array, int iLow, int iHigh); //蹇熸帓搴?br>
int main(int argc, char* argv[])
{
long data[] = {123,34,546,754,34,74,3,56};
int iDataLen = 8;
//涓轟簡瀵瑰悇涓瓙綰跨▼鍒嗗埆瀵瑰師濮嬫暟鎹繘琛屾帓搴忓拰淇濆瓨鎺掑簭緇撴灉
//鍒嗗埆鍒嗛厤鍐呭瓨瀵筪ata鏁扮粍鐨勬暟鎹繘琛屽鍒?br>
long *data1, *data2, *data3, *data4, *data5;
MySafeArray StructData1, StructData2, StructData3, StructData4;
data1 = new long[iDataLen];
memcpy(data1, data, iDataLen << 2); //鎶奷ata涓殑鏁版嵁澶嶅埗鍒癲ata1涓?br>
//鍐呭瓨澶嶅埗 memcpy(鐩爣鍐呭瓨鎸囬拡, 婧愬唴瀛樻寚閽? 澶嶅埗瀛楄妭鏁?, 鍥犱負long鐨勯暱搴?br>
//涓?瀛楄妭,鎵浠ュ鍒剁殑瀛楄妭鏁頒負iDataLen << 2, 鍗崇瓑浜巌DataLen*4
StructData1.data = data1;
StructData1.iLength = iDataLen;
data2 = new long[iDataLen];
memcpy(data2, data, iDataLen << 2);
StructData2.data = data2;
StructData2.iLength = iDataLen;
data3 = new long[iDataLen];
memcpy(data3, data, iDataLen << 2);
StructData3.data = data3;
StructData3.iLength = iDataLen;
data4 = new long[iDataLen];
memcpy(data4, data, iDataLen << 2);
StructData4.data = data4;
StructData4.iLength = iDataLen;
data5 = new long[iDataLen];
memcpy(data5, data, iDataLen << 2);
unsigned long TID1, TID2, TID3, TID4;
//瀵逛俊鍙烽噺榪涜鍒濆鍖?br>
evtTerminate = CreateEvent(NULL, FALSE, FALSE, "Terminate");
evtPrint = CreateEvent(NULL, FALSE, TRUE, "PrintResult");
//鍒嗗埆寤虹珛鍚勪釜瀛愮嚎紼?br>
CreateThread(NULL, 0, &BubbleSort, &StructData1, NULL, &TID1);
CreateThread(NULL, 0, &SelectSort, &StructData2, NULL, &TID2);
CreateThread(NULL, 0, &HeapSort, &StructData3, NULL, &TID3);
CreateThread(NULL, 0, &InsertSort, &StructData4, NULL, &TID4);
//鍦ㄤ富綰跨▼涓墽琛岃蹇熸帓搴忥紝鍏朵粬鎺掑簭鍦ㄥ瓙綰跨▼涓墽琛?
QuickSort(data5, 0, iDataLen - 1);
PrintResult(data5, iDataLen, "Quick Sort");
WaitForSingleObject(evtTerminate, INFINITE); //絳夊緟鎵鏈夌殑瀛愮嚎紼嬬粨鏉?br>
//鎵鏈夌殑瀛愮嚎紼嬬粨鏉熷悗錛屼富綰跨▼鎵嶅彲浠ョ粨鏉?br>
delete[] data1;
delete[] data2;
delete[] data3;
delete[] data4;
CloseHandle(evtPrint);
return 0;
}
/*
鍐掓場鎺掑簭鎬濇兂(鍗囧簭錛岄檷搴忓悓鐞嗭紝鍚庨潰鐨勭畻娉曚竴鏍烽兘鏄崌搴?:浠庡ご鍒板熬瀵規暟鎹繘琛屼袱涓ゆ瘮杈冭繘琛屼氦鎹?灝忕殑鏀懼墠澶х殑鏀懼悗銆傝繖鏍蜂竴嬈′笅鏉ワ紝鏈澶х殑鍏冪礌灝變細琚氦鎹㈢殑鏈鍚庯紝鐒跺悗涓嬩竴嬈?
寰幆灝變笉鐢ㄥ鏈鍚庝竴涓厓绱犺繘琛屾瘮杈冧氦鎹簡錛屾墍浠ュ憿姣忎竴嬈℃瘮杈冧氦鎹㈢殑嬈℃暟閮芥瘮涓婁竴嬈″驚鐜殑嬈℃暟灝戜竴錛岃繖鏍種嬈′箣鍚庢暟鎹氨鍙樺緱鍗囧簭鎺掑垪浜?/
unsigned long __stdcall BubbleSort(void* theArray)
{
long* Array = ((MySafeArray*)theArray)->data;
int iLength = ((MySafeArray*)theArray)->iLength;
int i, j=0;
long swap;
for (i = iLength-1; i >0; i--)
{
for(j = 0; j < i; j++)
{
if(Array[j] >Array[j+1]) //鍓嶆瘮鍚庡ぇ錛屼氦鎹?br>
{
swap = Array[j];
Array[j] = Array[j+1];
Array[j+1] = swap;
}
}
}
PrintResult(Array, iLength, "Bubble Sort"); //鍚戞帶鍒跺彴鎵撳嵃鎺掑簭緇撴灉
InterlockedIncrement(&ThreadCompleted); //榪斿洖鍓嶄嬌綰跨▼瀹屾垚鏁版爣璁板姞1
if(ThreadCompleted == 4) SetEvent(evtTerminate); //媯鏌ユ槸鍚﹀叾浠栫嚎紼嬮兘宸叉墽琛屽畬
//鑻ラ兘鎵ц瀹屽垯璁劇疆紼嬪簭緇撴潫淇″彿閲?br>
return 0;
}
/*閫夋嫨鎺掑簭鎬濇兂:姣忎竴嬈¢兘浠庢棤搴忕殑鏁版嵁涓壘鍑烘渶灝忕殑鍏冪礌錛岀劧鍚庡拰鍓嶉潰宸茬粡鏈夊簭鐨勫厓绱犲簭鍒楃殑鍚庝竴涓厓绱犺繘琛屼氦鎹紝榪欐牱鏁翠釜婧愬簭鍒楀氨浼氬垎鎴愪袱閮ㄥ垎錛屽墠闈竴閮?
鍒嗘槸宸茬粡鎺掑ソ搴忕殑鏈夊簭搴忓垪錛屽悗闈竴閮ㄥ垎鏄棤搴忕殑錛岀敤浜庨夊嚭鏈灝忕殑鍏冪礌銆傚驚鐜疦嬈′箣鍚庯紝鍓嶉潰鐨勬湁搴忓簭鍒楀姞闀垮埌璺熸簮搴忓垪涓鏍烽暱錛屽悗闈㈢殑鏃犲簭閮ㄥ垎闀垮害鍙樹負0錛屾帓
搴忓氨瀹屾垚浜嗐?/
unsigned long __stdcall SelectSort(void* theArray)
{
long* Array = ((MySafeArray*)theArray)->data;
int iLength = ((MySafeArray*)theArray)->iLength;
long lMin, lSwap;
int i, j, iMinPos;
for(i=0; i < iLength-1; i++)
{
lMin = Array[i];
iMinPos = i;
for(j=i + 1; j <= iLength-1; j++) //浠庢棤搴忕殑鍏冪礌涓壘鍑烘渶灝忕殑鍏冪礌
{
if(Array[j] < lMin)
{
iMinPos = j;
lMin = Array[j];
}
}
//鎶婇夊嚭鐨勫厓绱犱氦鎹㈡嫾鎺ュ埌鏈夊簭搴忓垪鐨勬渶鍚?br>
lSwap = Array[i];
Array[i] = Array[iMinPos];
Array[iMinPos] = lSwap;
}
PrintResult(Array, iLength, "Select Sort"); //鍚戞帶鍒跺彴鎵撳嵃鎺掑簭緇撴灉
InterlockedIncrement(&ThreadCompleted); //榪斿洖鍓嶄嬌綰跨▼瀹屾垚鏁版爣璁板姞1
if(ThreadCompleted == 4) SetEvent(evtTerminate);//媯鏌ユ槸鍚﹀叾浠栫嚎紼嬮兘宸叉墽琛屽畬
//鑻ラ兘鎵ц瀹屽垯璁劇疆紼嬪簭緇撴潫淇″彿閲?br>
return 0;
}
/*鍫嗘帓搴忔濇兂錛氬爢錛氭暟鎹厓绱犱粠1鍒癗鎺掑垪鎴愪竴媯典簩鍙夋爲錛岃屼笖榪欐5鏍戠殑姣忎竴涓瓙鏍戠殑鏍歸兘鏄鏍戜腑鐨勫厓绱犵殑鏈灝忔垨鏈澶х殑鍏冪礌榪欐牱濡傛灉涓涓棤搴忔暟鎹泦鍚堟槸涓涓?
鍫嗛偅涔堬紝鏍瑰厓绱犲氨鏄渶灝忔垨鏈澶х殑鍏冪礌鍫嗘帓搴忓氨鏄笉鏂鍓╀笅鐨勬暟鎹緩鍫嗭紝鎶婃渶灝忔垨鏈澶х殑鍏冪礌鏋愰忓嚭鏉ャ備笅闈㈢殑綆楁硶錛屽氨鏄粠鏈鍚庝竴涓厓绱犲紑濮嬶紝渚濇嵁涓涓妭鐐規瘮
鐖惰妭鐐規暟鍊煎ぇ鐨勫師鍒欏鎵鏈夊厓绱犺繘琛岃皟鏁達紝榪欐牱璋冩暣涓嬈″氨褰㈡垚涓涓爢錛岀涓涓厓绱犲氨鏄渶灝忕殑鍏冪礌銆傜劧鍚庡啀瀵瑰墿涓嬬殑鏃犲簭鏁版嵁鍐嶈繘琛屽緩鍫嗭紝娉ㄦ剰榪欐椂鍚庨潰鐨勬棤搴忔暟
鎹厓绱犵殑搴忔暟閮借鏀瑰彉錛屽絎竴嬈″緩鍫嗗悗錛岀浜屼釜鍏冪礌灝變細鍙樻垚鍫嗙殑絎竴涓厓绱犮?/
unsigned long __stdcall HeapSort(void* theArray)
{
long* Array = ((MySafeArray*)theArray)->data;
int iLength = ((MySafeArray*)theArray)->iLength;
int i, j, p;
long swap;
for(i=0; i銆{
for(j = iLength - 1; j>i; j--) //浠庢渶鍚庡掓暟涓婂幓姣旇緝瀛楄妭鐐瑰拰鐖惰妭鐐?br>
{
p = (j - i - 1)/2 + i; //璁$畻鐖惰妭鐐規暟緇勪笅鏍?br>
//娉ㄦ剰鍒版爲鑺傜偣搴忔暟璺熸暟緇勪笅鏍囦笉鏄瓑鍚岀殑錛屽洜涓哄緩鍫嗙殑鍏冪礌涓暟閫愪釜閫掑噺
if(Array[j] < Array[p]) //濡傛灉鐖惰妭鐐規暟鍊煎ぇ鍒欎氦鎹㈢埗鑺傜偣鍜屽瓧鑺傜偣
{
swap = Array[j];
Array[j] = Array[p];
Array[p] = swap;
}
}
}
PrintResult(Array, iLength, "Heap Sort"); //鍚戞帶鍒跺彴鎵撳嵃鎺掑簭緇撴灉
InterlockedIncrement(&ThreadCompleted); //榪斿洖鍓嶄嬌綰跨▼瀹屾垚鏁版爣璁板姞1
if(ThreadCompleted == 4) SetEvent(evtTerminate); //媯鏌ユ槸鍚﹀叾浠栫嚎紼嬮兘宸叉墽琛屽畬
//鑻ラ兘鎵ц瀹屽垯璁劇疆紼嬪簭緇撴潫淇″彿閲?br>
return 0;
}
/*鎻掑叆鎺掑簭鎬濇兂錛氭妸婧愭暟鎹簭鍒楃湅鎴愪袱鍗婏紝鍓嶉潰涓鍗婃槸鏈夊簭鐨勶紝鍚庨潰涓鍗婃槸鏃犲簭鐨勶紝鎶婃棤搴忕殑鏁版嵁浠庡ご鍒板熬閫愪釜閫愪釜鐨勬彃鍏ュ埌鍓嶉潰鐨勬湁搴忔暟鎹腑錛屼嬌寰楁湁搴忕殑鏁版嵁鐨勪釜鏁頒笉鏂澶э紝鍚屾椂鏃犲簭鐨勬暟鎹釜鏁板氨瓚婃潵瓚婂皯錛屾渶鍚庢墍鏈夊厓绱犻兘浼氬彉寰楁湁搴忋?/
unsigned long __stdcall InsertSort(void* theArray)
{
long* Array = ((MySafeArray*)theArray)->data;
int iLength = ((MySafeArray*)theArray)->iLength;
int i=1, j=0;
long temp;
for(i=1; i銆{
temp = Array[i]; //鍙栧嚭搴忓垪鍚庨潰鏃犲簭鏁版嵁鐨勭涓涓厓绱犲?br>
for(j=i; j>0; j--) //鍜屽墠闈㈢殑鏈夊簭鏁版嵁閫愪釜榪涜姣旇緝鎵懼嚭鍚堥傜殑鎻掑叆浣嶇疆
{
if(Array[j - 1] >temp) //濡傛灉璇ュ厓绱犳瘮鎻掑叆鍊煎ぇ鍒欏悗縐?br>
Array[j] = Array[j - 1];
else //濡傛灉璇ュ厓绱犳瘮鎻掑叆鍊煎皬錛岄偅涔堣浣嶇疆鐨勫悗涓浣嶅氨鏄彃鍏ュ厓绱犵殑浣嶇疆
break;
}
Array[j] = temp;
}
PrintResult(Array, iLength, "Insert Sort"); //鍚戞帶鍒跺彴鎵撳嵃鎺掑簭緇撴灉
InterlockedIncrement(&ThreadCompleted); //榪斿洖鍓嶄嬌綰跨▼瀹屾垚鏁版爣璁板姞1
if(ThreadCompleted == 4) SetEvent(evtTerminate); //媯鏌ユ槸鍚﹀叾浠栫嚎紼嬮兘宸叉墽琛屽畬
//鑻ラ兘鎵ц瀹屽垯璁劇疆紼嬪簭緇撴潫淇″彿閲?br>
return 0;
}
/*蹇熸帓搴忔濇兂錛氬揩閫熸帓搴忔槸鍒嗘不鎬濇兂鐨勪竴縐嶅簲鐢紝瀹冨厛閫夊彇涓涓敮鐐癸紝鐒跺悗鎶婂皬浜庢敮鐐圭殑鍏冪礌浜ゆ崲鍒版敮鐐圭殑鍓嶈竟錛屾妸澶т簬鏀偣鐨勫厓绱犱氦鎹㈠埌鏀偣鐨勫彸杈廣傜劧鍚庡啀瀵規敮鐐瑰乏杈歸儴鍒嗗拰鍙?br>
杈歸儴鍒嗚繘琛屽悓鏍風殑澶勭悊錛岃繖鏍瘋嫢騫叉涔嬪悗錛屾暟鎹氨浼氬彉寰楁湁搴忋備笅闈㈢殑瀹炵幇浣跨敤浜嗛掑綊
寤虹珛涓や釜娓告爣錛歩Low錛宨High錛沬Low鎸囧悜搴忓垪鐨勭涓涓厓绱狅紝iHigh鎸囧悜鏈鍚庝竴涓厛閫夌涓涓厓绱犱綔涓烘敮鐐癸紝騫舵妸瀹冪殑鍊煎瓨璐湪涓涓緟鍔╁彉閲忛噷銆?
閭d箞絎竴涓綅緗氨鍙樹負絀哄茍鍙互鏀劇疆鍏朵粬鐨勫厓绱犮?
榪欐牱浠巌High鎸囧悜鐨勫厓绱犲紑濮嬪悜鍓嶇Щ鍔ㄦ父鏍囷紝iHigh鏌ユ壘姣旀敮鐐瑰皬鐨勫厓绱狅紝濡傛灉鎵懼埌錛屽垯鎶婂畠鏀劇疆鍒扮┖緗簡鐨勪綅緗紙鐜板湪鏄涓涓綅緗級錛岀劧鍚巌High
娓告爣鍋滄縐誨姩錛岃繖鏃秈High鎸囧悜鐨勪綅緗絀虹疆錛岀劧鍚庣Щ鍔╥Low娓告爣瀵繪壘姣旀敮鐐瑰ぇ鐨勫厓绱犳斁緗埌iHigh鎸囧悜鐨勭┖緗殑浣嶇疆錛屽姝ゅ線澶嶇洿鍒癷Low涓?
iHigh鐩哥瓑銆傛渶鍚庝嬌鐢ㄩ掑綊瀵瑰乏鍙充袱閮ㄥ垎榪涜鍚屾牱澶勭悊*/
int QuickSort(long* Array, int iLow, int iHigh)
{
if(iLow >= iHigh) return 1; //閫掑綊緇撴潫鏉′歡
long pivot = Array[iLow];
int iLowSaved = iLow, iHighSaved = iHigh; //淇濇湭鏀瑰彉鐨刬Low錛宨High鍊間繚瀛樿搗鏉?br>
while (iLow < iHigh)
{
while (Array[iHigh] >= pivot && iHigh >iLow) //瀵繪壘姣旀敮鐐瑰ぇ鐨勫厓绱?br>
iHigh -- ;
Array[iLow] = Array[iHigh]; //鎶婃壘鍒扮殑鍏冪礌鏀劇疆鍒扮┖緗殑浣嶇疆
while (Array[iLow] < pivot && iLow < iHigh) //瀵繪壘姣旀敮鐐瑰皬鐨勫厓绱?br>
iLow ++ ;
Array[iHigh] = Array[iLow]; //鎶婃壘鍒扮殑鍏冪礌鏀劇疆鍒扮┖緗殑浣嶇疆
}
Array[iLow] = pivot; //鎶婃敮鐐瑰兼斁緗埌鏀偣浣嶇疆錛岃繖鏃舵敮鐐逛綅緗槸絀虹疆鐨?br>
//瀵瑰乏鍙抽儴鍒嗗垎鍒繘琛岄掑綊澶勭悊
QuickSort(Array, iLowSaved, iHigh-1);
QuickSort(Array, iLow+1, iHighSaved);
return 0;
}
//姣忎竴涓嚎紼嬮兘瑕佷嬌鐢ㄨ繖涓嚱鏁拌繘琛岃緭鍑猴紝鑰屼笖鍙湁涓涓樉紺哄櫒錛屼駭鐢熷涓嚎紼?br>
//绔炰簤瀵規帶鍒跺彴鐨勪嬌鐢ㄦ潈銆?br>
void PrintResult(long* Array, int iLength, const char* HeadStr)
{
WaitForSingleObject(evtPrint, INFINITE); //絳夊緟浜嬩歡鏈変俊鍙?br>
//EnterCriticalSection(&csPrint); //鏍囪鏈夌嚎紼嬭繘鍏ヤ復鐣屽尯
//WaitForSingleObject(mtxPrint, INFINITE); //絳夊緟浜掓枼閲忕┖緗紙娌℃湁綰跨▼鎷ユ湁瀹冿級
int i;
printf("%s: ", HeadStr);
for (i=0; i銆{
printf("%d,", Array[i]);
Sleep(100); //寤舵椂錛堝彲浠ュ幓鎺夛級
/*鍙槸浣垮緱澶氱嚎紼嬪涓寸晫鍖鴻闂殑闂姣旇緝瀹規槗鐪嬪緱鍒?br>
濡傛灉浣犳妸涓寸晫鎺у埗鐨勮鍙ユ敞閲婃帀錛岃緭鍑哄氨浼氬彉寰楀緢鍑屼貢錛屽悇涓帓搴忕殑緇撴灉浼?br>
鍒嗘彃闂撮殧鐫杈撳嚭錛屽鏋滀笉寤舵椂灝變笉瀹規槗鐪嬪埌榪欑涓嶅涓寸晫鍖烘帶鍒剁殑緇撴灉
*/
}
printf("%d\n", Array[i]);
SetEvent(evtPrint); //鎶婁簨浠朵俊鍙烽噺鎭㈠錛屽彉涓烘湁淇″彿
}
銆銆鍥涖?灝忕粨
瀵瑰鏉傜殑搴旂敤紼嬪簭鏉ヨ錛岀嚎紼嬬殑搴旂敤緇欏簲鐢ㄧ▼搴忔彁渚涗簡楂樻晥銆佸揩閫熴佸畨鍏ㄧ殑鏁版嵁澶勭悊鑳藉姏銆傛湰瀹炰緥璁茶堪浜嗙嚎紼嬪鐞嗕腑緇忓父閬囧埌鐨勯棶棰橈紝甯屾湜瀵硅鑰呮湅鍙嬫湁涓瀹氱殑甯姪錛岃搗鍒版姏鐮栧紩鐜夌殑浣滅敤銆?/p>
杞嚜錛坔ttp://hi.baidu.com/laodun/blog/item/8ab8f3241af3f7318644f916.html錛?/p>
1. 鎬庢牱浣跨敤MFC鍙戦佷竴涓秷鎭敤MFC鍙戦佷竴涓秷鎭殑鏂規硶鏄紝
聽聽聽聽棣栧厛錛屽簲鑾峰彇鎺ユ敹娑堟伅鐨凜Wnd綾誨璞$殑鎸囬拡錛?br />聽聽聽聽鐒跺悗,璋冪敤CWnd鐨勬垚鍛樺嚱鏁癝endMessage( )銆?br />聽聽聽聽聽聽聽聽LRESULT Res=pWnd->SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam);
聽聽聽聽聽聽聽聽pWnd鎸囬拡鎸囧悜鐩爣CWnd綾誨璞°傚彉閲廙sg鏄秷鎭紝wParam鍜宭Param鍙橀噺鍖呭惈娑堟伅鐨勫弬鏁幫紝濡傞紶鏍囧崟鍑誨摢閲屾垨閫夋嫨浜嗕粈涔堣彍鍗曢」銆傜洰鏍囩獥鍙h繑鍥炵殑娑堟伅緇撴灉鏀懼湪鍙橀噺Res涓?br />聽聽聽聽聽聽聽聽鍙戦佹秷鎭埌涓涓病鏈塁Wnd綾誨璞$殑紿楀彛錛屽彲浠ョ敤涓嬪垪鐩爣紿楀彛鐨勫彞鏌勭洿鎺ヨ皟鐢╓indows API錛?br />聽聽聽聽聽聽聽聽LRESULT Res=::SendMessage(HWND hWnd, UINT Msg,聽 WPARAM wParam, LPARAM lParam);
聽聽聽聽聽聽聽聽榪欓噷鐨刪Wnd鏄洰鏍囩獥鍙g殑鍙ユ焺銆?br />2. 鎬庢牱鐢∕FC瀵勯佷竴涓秷鎭?br />聽聽聽聽鐢∕FC瀵勯佷竴涓秷鎭笌鍙戦佷竴涓秷鎭嚑涔庣浉鍚岋紝浣嗗瘎閫佹椂鐢≒ostMessage( ) 錛岃屼笉鏄敤SendMessage( )錛涜繑鍥炲糝es涔熶笉涓鏍鳳紝Res涓嶆槸涓涓敱鐩爣紿楀彛榪斿洖鐨勫鹼紝鑰屾槸涓涓竷灝斿鹼紝鐢ㄦ潵琛ㄧず娑堟伅鏄惁鎴愬姛鍦版斁鍒版秷鎭槦鍒椾腑銆?br />3. 媯绱竴涓瘎閫佹秷鎭?br />聽聽聽聽姝e父鎯呭喌涓嬶紝涓鏃︽秷鎭瀵勯佸悗錛屽簲鐢ㄧ▼搴忓湪鍚庡彴鍙戦佸畠銆備絾鏄湪鐗規畩鎯呭喌涓嬶紝闇瑕佷綘鑷繁鍘誨垹闄や竴涓秷鎭紝渚嬪鎯沖湪搴旂敤紼嬪簭鎺ユ敹鍒版煇縐嶆秷鎭箣鍓嶅仠姝㈠簲鐢ㄧ▼搴忋傛湁涓ょ鏂規硶鍙互浠庡簲鐢ㄧ▼搴忔秷鎭槦鍒椾腑鍒犻櫎涓涓秷鎭紝浣嗚繖涓ょ鏂規硶閮芥病鏈夋秹鍙奙FC銆?br />鈻?絎竴縐嶆柟娉曪細鍦ㄤ笉騫叉壈浠諱綍浜嬫儏涔嬩笅紿ヨ娑堟伅闃熷垪錛岀湅鐪嬩竴涓秷鎭槸鍚﹀湪閭i噷銆?br />聽聽聽聽BOOL res=::PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ) ;
鈻?絎簩縐嶆柟娉曪細瀹為檯涓婃槸絳夊緟錛屼竴鐩寸瓑鍒頒竴涓柊鐨勬秷鎭埌杈鵑槦鍒椾負姝紝鐒跺悗鍒犻櫎騫惰繑鍥炶娑堟伅銆?br />聽聽聽聽BOOL res=::GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
聽聽聽聽鍦ㄨ繖涓ょ鏂規硶涓紝鍙橀噺hWnd鎸囧畾瑕佹埅鑾鋒秷鎭殑紿楀彛錛屽鏋滆鍙橀噺璁句負NULL錛屾墍鏈夌獥鍙f秷鎭皢琚埅鑾楓倃MsgFilterMin鍜寃MsgFilterMax鍙橀噺涓嶴endMessage( )涓殑鍙橀噺Msg鐩稿搴旓紝鎸囧畾鏌ョ湅娑堟伅鐨勮寖鍥淬傚鏋滅敤"0,0"錛屽垯鎵鏈夌殑娑堟伅閮藉皢琚埅鑾楓傚鏋滅敤WM_KEYFIRST,WM_KEYLAST鎴朩M_MOUSEFIRST,WM_MOUSELAST錛屽垯鎵鏈夐敭鐩樻垨榧犳爣鐨勬秷鎭皢琚埅鑾楓倃RemoveMsg鍙橀噺鎸囧畾PeekMessage( )鏄惁搴旇鐪熸鍦頒粠闃熷垪涓垹闄よ娑堟伅銆?GetMessage( )鎬繪槸鍒犻櫎娑堟伅)銆傝鍙橀噺鍙互鍙栦袱涓鹼細
聽聽聽聽鈻?PM_REMOVE錛孭eekMessage( )灝嗗垹闄ゆ秷鎭?br />聽聽聽聽鈻?PM_NOREMOVE錛孭eekMessage( )灝嗘妸娑堟伅鐣欏湪闃熷垪閲岋紝騫惰繑鍥炲畠鐨勪竴涓嫹璐濄?br />聽聽聽聽褰撶劧錛屽鏋滄妸娑堟伅鐣欏湪娑堟伅闃熷垪涓紝鐒跺悗鍐嶆璋冪敤PeekMessage( )鏌ョ湅鐩稿悓綾誨瀷鐨勬秷鎭紝鍒欏皢榪斿洖瀹屽叏鐩稿悓鐨勬秷鎭?br />聽聽聽聽lpMsg鍙橀噺鏄竴涓寚鍚慚SG緇撴瀯鐨勬寚閽堬紝MSG鍖呭惈媯绱㈠埌鐨勬秷鎭?br />聽聽聽聽typedef struct tagMSG {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽HWND hwnd; // window handle message is intended for
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽UINT message;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽WPARAM wParam;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽LPARAM lParam;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽DWORD time; // the time the message was put in the queue
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽POINT pt; // the location of the mouse cursor when the
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // message was put in the queue
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽} MSG;
4. MFC鎬庢牱鎺ユ敹涓涓瘎閫佺殑娑堟伅
聽聽聽 MFC澶勭悊涓涓瘎閫佸拰鍙戦佹秷鎭殑鍞竴鏄庢樉涓嶅悓鏄瘎閫佺殑娑堟伅瑕佸湪搴旂敤紼嬪簭鐨勬秷鎭槦鍒椾腑鑺辮垂涓浜涙椂闂淬傚湪娑堟伅娉?message pump)寮瑰嚭瀹冧箣鍓嶏紝瀹冭涓鐩村湪闃熷垪涓?br />聽聽聽 娑堟伅娉?br />聽聽聽 MFC搴旂敤紼嬪簭涓殑娑堟伅娉靛湪CWinApp鐨勬垚鍛樺嚱鏁癛un()涓傚簲鐢ㄧ▼搴忓紑濮嬭繍琛屾椂錛孯un()灝辮璋冪敤,Run()鎶婃椂闂村垎鍓叉垚涓ら儴鍒嗐備竴閮ㄥ垎鐢ㄦ潵鎵ц鍚庡彴澶勭悊錛屽鍙栨秷涓存椂CWnd瀵硅薄錛涘彟涓閮ㄥ垎鐢ㄦ潵媯鏌ユ秷鎭槦鍒椼傚綋涓涓柊鐨勬秷鎭繘鏉ユ椂錛孯un()鎶藉彇瀹冣斿嵆鐢℅etMessage( )浠庨槦鍒椾腑鍙栧嚭璇ユ秷鎭紝榪愯涓や釜娑堟伅緲昏瘧鍑芥暟錛岀劧鍚庣敤DispatchMessage( )鍑芥暟璋冪敤璇ユ秷鎭鏈熺殑鐩爣紿楀彛榪涚▼銆?br />聽聽聽 娑堟伅娉佃皟鐢ㄧ殑涓や釜緲昏瘧鍑芥暟鏄疨reTranslateMessage( )鍜?:TranslateMessage( )銆傜洰鏍囩獥鍙g殑MFC綾誨彲璋冪敤reTranslateMessage鍦ㄥ彂閫佹秷鎭粰瀹冧箣鍓嶈繘琛屾秷鎭炕璇戯紝渚嬪錛孋FrameWnd鐢≒reTranslateMessage( )灝嗗姞閫熼敭(濡傦紝Ctrl+S瀛樺偍鏂囦歡)杞崲涓哄懡浠ゆ秷鎭傜炕璇戝墠鐨勬秷鎭氬父琚鐞嗘帀錛岃岀炕璇戝悗鐨勬秷鎭?濡傛灉鏈夌殑璇?灝嗚閲嶆柊瀵勯佸埌闃熷垪閲屻?:TranslateMessage鏄竴涓獥鍙e嚱鏁幫紝灝嗗師濮嬮敭鐮佽漿鎹負閿瓧絎︺傛秷鎭竴鏃﹁DispatchMessage()鍙戦侊紝MFC澶勭悊瀹冨氨鍍忓鐞哠endMessage()鍙戦佺殑娑堟伅涓鏍楓?br />5. MFC鎬庢牱澶勭悊涓涓帴鏀跺埌鐨勬秷鎭?br />聽聽聽 澶勭悊鎺ユ敹鍒扮殑娑堟伅鐨勭洰鐨勯潪甯哥畝鍗曪細灝嗘秷鎭寚鍚戜竴涓嚱鏁幫紝璇ュ嚱鏁伴氳繃娑堟伅涓殑娑堟伅鏍囪瘑絎﹀鐞嗗畠銆傞潪MFC紿楀彛鐢ㄧ畝鍗曠殑case璇彞鏉ュ疄鐜拌鐩爣錛屾瘡涓猚ase璇彞鎵ц涓浜涘嚱鏁幫紝鎴栬皟鐢ㄥ叾浠栦竴浜涘嚱鏁般?br />聽聽聽 MainWndProc(HWND hWnd, UINT message, W PARAM wParam,LPARAM lParam)
聽聽聽 {
聽聽聽聽聽聽聽 switch(message)
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽 case WM_CREATE:
聽聽聽聽聽聽聽聽聽聽聽 : : :
聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 case WM_PAINT:
聽聽聽聽聽聽聽聽聽聽聽 : : :
聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 default:
聽聽聽聽聽聽聽 return(DefWindowProc(hWnd,message,wParam,lParam));
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 return(NULL);
聽聽聽 }
聽聽聽 浠諱綍閬楁紡鐨勬秷鎭皢琚紶杈撳埌涓涓粯璁ょ殑娑堟伅澶勭悊鍑芥暟錛屼絾鏄紝case璇彞涓嶈兘寰堝ソ鍦伴傚簲C++鍜屽皝瑁呮妧鏈傚湪C++鐜涓紝瑕佹眰娑堟伅琚竴涓笓闂ㄥ鐞嗚綾誨瀷娑堟伅鐨勭被鐨勬垚鍛樺嚱鏁板鐞嗐傚洜姝わ紝MFC涓嶉噰鐢╟ase璇彞錛岃岄噰鐢ㄦ洿鍔犲鏉傚拰鍥炴棆鐨勬柟娉曘備絾瀹冨厑璁哥敤縐佹湁綾誨鐞嗘秷鎭紝鑰屽彧闇鍋氫笅闈笁浠朵簨鎯咃細
聽聽聽 鈻?浠庡皢瑕佹帴鏀舵秷鎭殑CWnd綾誨璞℃淳鐢熺被(瀵逛簬鍛戒護娑堟伅鏄疌CmdTarget)銆?br />聽聽聽 鈻?鍦ㄦ淳鐢熺被涓啓涓涓鐞嗘秷鎭殑鎴愬憳鍑芥暟銆?br />聽聽聽 鈻?鍦ㄧ被涓畾涔変竴涓煡鎵捐〃(鍙仛娑堟伅鏄犲儚)錛岃琛ㄥ叿鏈夋垚鍛樺嚱鏁扮殑鏉$洰鍜屽畠瑕佸鐞嗙殑娑堟伅鐨勬爣璇嗙銆?br />聽聽聽 鐒跺悗錛孧FC渚濇璋冪敤涓嬮潰鐨勫嚱鏁幫紝鎸囧紩杈撳叆娑堟伅鍒板鐞嗗嚱鏁般?br />聽聽聽 1) AfxWndProc( )鎺ユ敹娑堟伅錛屽鎵炬秷鎭墍灞炵殑CWnd瀵硅薄錛岀劧鍚庤皟鐢ˋfxCallWndProc( )銆?br />聽聽聽 2) AfxCallWndProc( )瀛樺偍娑堟伅(娑堟伅鏍囪瘑絎﹀拰鍙傛暟)渚涙湭鏉ュ弬鑰冿紝鐒跺悗璋冪敤WindowProc( )銆?br />聽聽聽 3) WindowProc( ) 鍙戦佹秷鎭粰OnWndMsg( ) 錛岀劧鍚庯紝濡傛灉娑堟伅鏈澶勭悊錛屽垯鍙戦佺粰DefWindowproc( )銆?br />聽聽聽 4) OnWndMsg( )瑕佷箞涓篧M_COMMAND娑堟伅璋冪敤OnCommand( )錛岃涔堜負WM_NOTIFY娑堟伅璋冪敤OnNotify( )銆備換浣曡閬楁紡鐨勬秷鎭兘灝嗘槸涓涓獥鍙f秷鎭侽nWndMsg( )鎼滅儲綾葷殑娑堟伅鏄犲儚錛屼互鎵懼埌涓涓兘澶勭悊浠諱綍紿楀彛娑堟伅鐨勫鐞嗗嚱鏁般傚鏋淥nWndMsg( )涓嶈兘鎵懼埌榪欐牱鐨勫鐞嗗嚱鏁幫紝鍒欐妸娑堟伅榪斿洖鍒癢indowProc( )錛岀敱瀹冨皢娑堟伅鍙戦佺粰DefWindowProc( )銆?br />聽聽聽 5) OnCommand()鏌ョ湅榪欐槸涓嶆槸涓涓帶浠墮氱煡(lParam涓嶆槸NULL)錛涘鏋滃畠鏄紝OnCommand( )灝辮瘯鍥懼皢娑堟伅鏄犲皠鍒板埗閫犻氱煡鐨勬帶浠訛紱濡傛灉瀹冧笉鏄竴涓帶浠墮氱煡錛屾垨鑰呮帶浠舵嫆緇濇槧灝勭殑娑堟伅錛孫nCommand( )灝辮皟鐢∣nCmdMsg( )銆?br />聽聽聽 6) OnNotify( )涔熻瘯鍥懼皢娑堟伅鏄犲皠鍒板埗閫犻氱煡鐨勬帶浠訛紱濡傛灉鏄犲皠涓嶆垚鍔燂紝 OnNotify( )灝辮皟鐢ㄧ浉鍚岀殑OnCmdMsg( )鍑芥暟銆?br />聽聽聽 7) 鏍規嵁鎺ユ敹娑堟伅鐨勭被錛孫nCmdMsg( )灝嗗湪涓涓О涓哄懡浠や紶閫?Command Routing)鐨勮繃紼嬩腑娼滃湪鍦頒紶閫掑懡浠ゆ秷鎭拰鎺т歡閫氱煡銆備緥濡傦紝濡傛灉鎷ユ湁璇ョ獥鍙g殑綾繪槸涓涓鏋剁被錛屽垯鍛戒護鍜岄氱煡娑堟伅涔熻浼犻掑埌瑙嗗浘鍜屾枃妗g被錛屽茍涓鴻綾誨鎵句竴涓秷鎭鐞嗗嚱鏁般?br />涓轟粈涔堣娑堟伅鏄犲儚錛?br />聽聽聽 榪欐瘯绔熸槸C++璇█錛涗負浠涔圤nWndMsg( )涓嶄負姣忎釜紿楀彛娑堟伅璋冪敤涓涓瀹氫箟鐨勮櫄鎷熷嚱鏁幫紵鍥犱負瀹冨お鍗燙PU銆傝嫢鏄偅鏍鳳紝褰撴壂鎻忎竴涓秷鎭槧鍍忎互鍔犻熻榪囩▼鏃訛紝OnWndMsg( )鍙兘浼氬仛鍑烘剰鎯充笉鍒扮殑浜嬫儏錛屽茍闄峰叆姹囩紪鍣ㄣ傛敞鎰忛氳繃閲嶈澆WindowProc( )銆丱nWndMsg( )銆丱nCommand( )銆丱nNotify( ) 鎴朞nCmdMsg( )鍙互淇敼榪欎竴榪囩▼銆傞噸杞絆nWndMsg( )鍙互鍦ㄧ獥鍙f秷鎭鎺掑簭涔嬪墠鎻掑叆璇ヨ繃紼嬨傞噸杞絆nCommand( )鎴朞nNotify( )鍙互鍦ㄦ秷鎭鍙嶅皠涔嬪墠鎻掑叆璇ヨ繃紼嬨?/p>