锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 涓涓鍧涗腑鍙堜竴澶?#8220;姘寸帇”錛屼粬涓嶄絾鍠滄鍙戝笘錛岃繕浼氬洖澶嶅叾浠朓D鍙戠殑姣忎釜甯栧瓙銆傝“姘寸帇”鍙戝笘鏁扮洰瓚呰繃浜嗘繪暟鐨勪竴鍗娿傚鏋滀綘鍙堜竴涓綋鍓嶈鍧涙墍鏈夊笘瀛愶紙鍖呮嫭鍥炲笘錛夌殑鍒楄〃錛屽叾涓笘瀛愪綔鑰呯殑ID涔熷湪琛ㄤ腑錛屼綘鑳藉揩閫熸壘鍑鴻繖涓紶璇翠腑鐨勬按鐜嬪悧錛?/p>
鍒嗘瀽涓庤В娉曪細 銆銆棣栧厛鎯沖埌鐨勬槸涓涓渶鐩存帴鐨勬柟娉曪紝鎴戜滑鍙互闃熸墍鏈塈D榪涜鎺掑簭銆傜劧鍚庡啀鎵弿涓閬嶆帓濂藉簭鐨処D鍒楄〃錛岀粺璁″悇涓狪D鍑虹幇鐨勬鏁般傚鏋滄煇涓狪D鍑虹幇鐨勬鏁拌秴榪囨繪暟鐨勪竴鍗婏紝閭d箞灝辮緭鍑鴻繖涓狪D銆傝繖涓畻娉曠殑鏃墮棿澶嶆潅搴︿負O(N*log2N+N)銆?/p>
濡傛灉涓涓狪D鍑虹幇鐨勬鏁拌秴榪囨繪暟N鐨勪竴鍗娿傞偅涔堬紝鏃犺姘寸帇鐨処D鏄粈涔堬紝榪欎釜鏈夊簭鐨処D鍒楄〃涓殑絎琋/2欏癸紙浠?寮濮嬬紪鍙鳳級涓瀹氫細鏄繖涓狪D錛堣鑰呭彲浠ヨ瘯鐫璇佹槑涓涓嬶級銆傜渷鍘婚噸鏂版壂鎻忎竴閬嶅垪琛紝鍙互鑺傜渷涓鐐圭畻娉曡楄垂鐨勬椂闂淬傚鏋滆兘澶熻繀閫熷畾浣嶅埌鍒楄〃鐨勬煇涓欏癸紙姣斿浣跨敤鏁扮粍鏉ュ瓨鍌ㄥ垪琛級錛岄櫎鍘繪帓搴忕殑鏃墮棿澶嶆潅搴︼紝鍚庡鐞嗛渶瑕佺殑鏃墮棿涓篛錛?錛夈?/p>
濡傛灉姣忔鍒犻櫎涓や釜涓嶅悓鐨処D錛堜笉綆℃槸鍚﹀寘鍚?#8220;姘寸帇”鐨処D錛夛紝閭d箞錛屽湪鍓╀笅鐨処D鍒楄〃涓紝“姘寸帇”ID鍑虹幇鐨勬鏁頒粛鐒惰秴榪囨繪暟鐨勪竴鍗娿傜湅鍒拌繖涓鐐逛箣鍚庯紝灝卞彲浠ラ氳繃涓嶆柇閲嶅榪欎釜榪囩▼錛屾妸ID鍒楄〃涓殑ID鎬繪暟闄嶄綆錛堣漿鍖栦負鏇村皬鐨勯棶棰橈級錛屼粠鑰屽緱鍒伴棶棰樼殑絳旀銆傛柊鐨勬濊礬錛岄伩鍏嶄簡鎺掑簭榪欎釜鑰楁椂鐨勬楠わ紝鎬葷殑鏃墮棿澶嶆潅搴﹀彧鏈塐錛圢錛夛紝涓斿彧闇瑕佸父鏁扮殑棰濆鍐呭瓨銆?/p>
VC涓綰跨▼浣跨敤姣旇緝騫挎硾鑰屼笖瀹炵敤,鍦ㄧ綉涓婄湅鍒扮殑鏁欑▼.鎰熻鍐欑殑鎸哄ソ.
涓銆侀棶棰樼殑鎻愬嚭
緙栧啓涓涓楁椂鐨勫崟綰跨▼紼嬪簭錛?/p>
銆銆鏂板緩涓涓熀浜庡璇濇鐨勫簲鐢ㄧ▼搴廠ingleThread錛屽湪涓誨璇濇IDD_SINGLETHREAD_DIALOG娣誨姞涓涓寜閽紝ID涓篒DC_SLEEP_SIX_SECOND錛屾爣棰樹負“寤舵椂6縐?#8221;錛屾坊鍔犳寜閽殑鍝嶅簲鍑芥暟錛屼唬鐮佸涓嬶細
void CSingleThreadDlg::OnSleepSixSecond()
{
Sleep(6000); //寤舵椂6縐?br>}
銆銆緙栬瘧騫惰繍琛屽簲鐢ㄧ▼搴忥紝鍗曞嚮“寤舵椂6縐?#8221;鎸夐挳錛屼綘灝變細鍙戠幇鍦ㄨ繖6縐掓湡闂寸▼搴忓氨璞?#8220;姝繪満”涓鏍鳳紝涓嶅湪鍝嶅簲鍏跺畠娑堟伅銆備負浜嗘洿濂藉湴澶勭悊榪欑鑰楁椂鐨勬搷浣滐紝鎴戜滑鏈夊繀瑕佸涔犫斺斿綰跨▼緙栫▼銆?br>浜屻佸綰跨▼姒傝堪
銆銆榪涚▼鍜岀嚎紼嬮兘鏄搷浣滅郴緇熺殑姒傚康銆傝繘紼嬫槸搴旂敤紼嬪簭鐨勬墽琛屽疄渚嬶紝姣忎釜榪涚▼鏄敱縐佹湁鐨勮櫄鎷熷湴鍧絀洪棿銆佷唬鐮併佹暟鎹拰鍏跺畠鍚勭緋葷粺璧勬簮緇勬垚錛岃繘紼嬪湪榪愯榪囩▼涓垱寤虹殑璧勬簮闅忕潃榪涚▼鐨勭粓姝㈣岃閿姣侊紝鎵浣跨敤鐨勭郴緇熻祫婧愬湪榪涚▼緇堟鏃惰閲婃斁鎴栧叧闂?br>銆銆綰跨▼鏄繘紼嬪唴閮ㄧ殑涓涓墽琛屽崟鍏冦傜郴緇熷垱寤哄ソ榪涚▼鍚庯紝瀹為檯涓婂氨鍚姩鎵ц浜嗚榪涚▼鐨勪富鎵ц綰跨▼錛屼富鎵ц綰跨▼浠ュ嚱鏁板湴鍧褰㈠紡錛屾瘮濡傝main鎴朩inMain鍑芥暟錛屽皢紼嬪簭鐨勫惎鍔ㄧ偣鎻愪緵緇橶indows緋葷粺銆備富鎵ц綰跨▼緇堟浜嗭紝榪涚▼涔熷氨闅忎箣緇堟銆?br>銆銆姣忎竴涓繘紼嬭嚦灝戞湁涓涓富鎵ц綰跨▼錛屽畠鏃犻渶鐢辯敤鎴峰幓涓誨姩鍒涘緩錛屾槸鐢辯郴緇熻嚜鍔ㄥ垱寤虹殑銆傜敤鎴鋒牴鎹渶瑕佸湪搴旂敤紼嬪簭涓垱寤哄叾瀹冪嚎紼嬶紝澶氫釜綰跨▼騫跺彂鍦拌繍琛屼簬鍚屼竴涓繘紼嬩腑銆備竴涓繘紼嬩腑鐨勬墍鏈夌嚎紼嬮兘鍦ㄨ榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿涓紝鍏卞悓浣跨敤榪欎簺铏氭嫙鍦板潃絀洪棿銆佸叏灞鍙橀噺鍜岀郴緇熻祫婧愶紝鎵浠ョ嚎紼嬮棿鐨勯氳闈炲父鏂逛究錛屽綰跨▼鎶鏈殑搴旂敤涔熻緝涓哄箍娉涖?br>銆銆澶氱嚎紼嬪彲浠ュ疄鐜板茍琛屽鐞嗭紝閬垮厤浜嗘煇欏逛換鍔¢暱鏃墮棿鍗犵敤CPU鏃墮棿銆傝璇存槑鐨勪竴鐐規槸錛岀洰鍓嶅ぇ澶氭暟鐨勮綆楁満閮芥槸鍗曞鐞嗗櫒錛圕PU錛夌殑錛屼負浜嗚繍琛屾墍鏈夎繖浜涚嚎紼嬶紝鎿嶄綔緋葷粺涓烘瘡涓嫭绔嬬嚎紼嬪畨鎺掍竴浜汣PU鏃墮棿錛屾搷浣滅郴緇熶互杞崲鏂瑰紡鍚戠嚎紼嬫彁渚涙椂闂寸墖錛岃繖灝辯粰浜轟竴縐嶅亣璞★紝濂借薄榪欎簺綰跨▼閮藉湪鍚屾椂榪愯銆傜敱姝ゅ彲瑙侊紝濡傛灉涓や釜闈炲父媧昏穬鐨勭嚎紼嬩負浜嗘姠澶哄CPU鐨勬帶鍒舵潈錛屽湪綰跨▼鍒囨崲鏃朵細娑堣楀緢澶氱殑CPU璧勬簮錛屽弽鑰屼細闄嶄綆緋葷粺鐨勬ц兘銆傝繖涓鐐瑰湪澶氱嚎紼嬬紪紼嬫椂搴旇娉ㄦ剰銆?br>銆銆Win32 SDK鍑芥暟鏀寔榪涜澶氱嚎紼嬬殑紼嬪簭璁捐錛屽茍鎻愪緵浜嗘搷浣滅郴緇熷師鐞嗕腑鐨勫悇縐嶅悓姝ャ佷簰鏂ュ拰涓寸晫鍖虹瓑鎿嶄綔銆俈isual C++ 6.0涓紝浣跨敤MFC綾誨簱涔熷疄鐜頒簡澶氱嚎紼嬬殑紼嬪簭璁捐錛屼嬌寰楀綰跨▼緙栫▼鏇村姞鏂逛究銆?/p>
涓夈乄in32 API瀵瑰綰跨▼緙栫▼鐨勬敮鎸?/p>
銆銆Win32 鎻愪緵浜嗕竴緋誨垪鐨凙PI鍑芥暟鏉ュ畬鎴愮嚎紼嬬殑鍒涘緩銆佹寕璧楓佹仮澶嶃佺粓緇撲互鍙婇氫俊絳夊伐浣溿備笅闈㈠皢閫夊彇鍏朵腑鐨勪竴浜涢噸瑕佸嚱鏁拌繘琛岃鏄庛?
1銆丠ANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
璇ュ嚱鏁板湪鍏惰皟鐢ㄨ繘紼嬬殑榪涚▼絀洪棿閲屽垱寤轟竴涓柊鐨勭嚎紼嬶紝騫惰繑鍥炲凡寤虹嚎紼嬬殑鍙ユ焺錛屽叾涓悇鍙傛暟璇存槑濡備笅錛?br>lpThreadAttributes錛氭寚鍚戜竴涓?SECURITY_ATTRIBUTES 緇撴瀯鐨勬寚閽堬紝璇ョ粨鏋勫喅瀹氫簡綰跨▼鐨勫畨鍏ㄥ睘鎬э紝涓鑸疆涓?NULL錛?
dwStackSize錛氭寚瀹氫簡綰跨▼鐨勫爢鏍堟繁搴︼紝涓鑸兘璁劇疆涓?錛?
lpStartAddress錛氳〃紺烘柊綰跨▼寮濮嬫墽琛屾椂浠g爜鎵鍦ㄥ嚱鏁扮殑鍦板潃錛屽嵆綰跨▼鐨勮搗濮嬪湴鍧銆備竴鑸儏鍐典負(LPTHREAD_START_ROUTINE)ThreadFunc錛孴hreadFunc 鏄嚎紼嬪嚱鏁板悕錛?
lpParameter錛氭寚瀹氫簡綰跨▼鎵ц鏃朵紶閫佺粰綰跨▼鐨?2浣嶅弬鏁幫紝鍗崇嚎紼嬪嚱鏁扮殑鍙傛暟錛?
dwCreationFlags錛氭帶鍒剁嚎紼嬪垱寤虹殑闄勫姞鏍囧織錛屽彲浠ュ彇涓ょ鍊箋傚鏋滆鍙傛暟涓?錛岀嚎紼嬪湪琚垱寤哄悗灝變細绔嬪嵆寮濮嬫墽琛岋紱濡傛灉璇ュ弬鏁頒負CREATE_SUSPENDED,鍒欑郴緇熶駭鐢熺嚎紼嬪悗錛岃綰跨▼澶勪簬鎸傝搗鐘舵侊紝騫朵笉椹笂鎵ц錛岀洿鑷沖嚱鏁癛esumeThread琚皟鐢紱
lpThreadId錛氳鍙傛暟榪斿洖鎵鍒涘緩綰跨▼鐨処D錛?
濡傛灉鍒涘緩鎴愬姛鍒欒繑鍥炵嚎紼嬬殑鍙ユ焺錛屽惁鍒欒繑鍥濶ULL銆?
2銆丏WORD SuspendThread(HANDLE hThread);
璇ュ嚱鏁扮敤浜庢寕璧鋒寚瀹氱殑綰跨▼錛屽鏋滃嚱鏁版墽琛屾垚鍔燂紝鍒欑嚎紼嬬殑鎵ц琚粓姝€?3銆丏WORD ResumeThread(HANDLE hThread);
璇ュ嚱鏁扮敤浜庣粨鏉熺嚎紼嬬殑鎸傝搗鐘舵侊紝鎵ц綰跨▼銆?4銆乂OID ExitThread(DWORD dwExitCode);
璇ュ嚱鏁扮敤浜庣嚎紼嬬粓緇撹嚜韜殑鎵ц錛屼富瑕佸湪綰跨▼鐨勬墽琛屽嚱鏁頒腑琚皟鐢ㄣ傚叾涓弬鏁癲wExitCode鐢ㄦ潵璁劇疆綰跨▼鐨勯鍑虹爜銆?5銆丅OOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
銆銆涓鑸儏鍐典笅錛岀嚎紼嬭繍琛岀粨鏉熶箣鍚庯紝綰跨▼鍑芥暟姝e父榪斿洖錛屼絾鏄簲鐢ㄧ▼搴忓彲浠ヨ皟鐢═erminateThread寮鴻緇堟鏌愪竴綰跨▼鐨勬墽琛屻傚悇鍙傛暟鍚箟濡備笅錛?br>hThread錛氬皢琚粓緇撶殑綰跨▼鐨勫彞鏌勶紱
dwExitCode錛氱敤浜庢寚瀹氱嚎紼嬬殑閫鍑虹爜銆?
銆銆浣跨敤TerminateThread()緇堟鏌愪釜綰跨▼鐨勬墽琛屾槸涓嶅畨鍏ㄧ殑錛屽彲鑳戒細寮曡搗緋葷粺涓嶇ǔ瀹氾紱铏界劧璇ュ嚱鏁扮珛鍗崇粓姝㈢嚎紼嬬殑鎵ц錛屼絾騫朵笉閲婃斁綰跨▼鎵鍗犵敤鐨勮祫婧愩傚洜姝わ紝涓鑸笉寤鴻浣跨敤璇ュ嚱鏁般?
6銆丅OOL PostThreadMessage(DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam);
璇ュ嚱鏁板皢涓鏉℃秷鎭斁鍏ュ埌鎸囧畾綰跨▼鐨勬秷鎭槦鍒椾腑錛屽茍涓斾笉絳夊埌娑堟伅琚綰跨▼澶勭悊鏃朵究榪斿洖銆?br>idThread錛氬皢鎺ユ敹娑堟伅鐨勭嚎紼嬬殑ID錛?
Msg錛氭寚瀹氱敤鏉ュ彂閫佺殑娑堟伅錛?
wParam錛氬悓娑堟伅鏈夊叧鐨勫瓧鍙傛暟錛?
lParam錛氬悓娑堟伅鏈夊叧鐨勯暱鍙傛暟錛?
璋冪敤璇ュ嚱鏁版椂錛屽鏋滃嵆灝嗘帴鏀舵秷鎭殑綰跨▼娌℃湁鍒涘緩娑堟伅寰幆錛屽垯璇ュ嚱鏁版墽琛屽け璐ャ?/p>
鍥涖乄in32 API澶氱嚎紼嬬紪紼嬩緥紼?/p>
渚嬬▼1 MultiThread1
寤虹珛涓涓熀浜庡璇濇鐨勫伐紼婱ultiThread1錛屽湪瀵硅瘽妗咺DD_MULTITHREAD1_DIALOG涓姞鍏ヤ袱涓寜閽拰涓涓紪杈戞錛屼袱涓寜閽殑ID鍒嗗埆鏄疘DC_START錛孖DC_STOP 錛屾爣棰樺垎鍒負“鍚姩”錛?#8220;鍋滄”錛孖DC_STOP鐨勫睘鎬ч変腑Disabled錛涚紪杈戞鐨処D涓篒DC_TIME 錛屽睘鎬ч変腑Read-only錛?br>銆
鍦∕ultiThread1Dlg.h鏂囦歡涓坊鍔犵嚎紼嬪嚱鏁板0鏄庯細 void ThreadFunc();
娉ㄦ剰錛岀嚎紼嬪嚱鏁扮殑澹版槑搴斿湪綾籆MultiThread1Dlg鐨勫閮ㄣ?鍦ㄧ被CMultiThread1Dlg鍐呴儴娣誨姞protected鍨嬪彉閲忥細 HANDLE hThread;
DWORD ThreadID;
鍒嗗埆浠h〃綰跨▼鐨勫彞鏌勫拰ID銆?
銆
鍦∕ultiThread1Dlg.cpp鏂囦歡涓坊鍔犲叏灞鍙橀噺m_bRun 錛?volatile BOOL m_bRun;
m_bRun 浠h〃綰跨▼鏄惁姝e湪榪愯銆?/p>
浣犺鐣欐剰鍒板叏灞鍙橀噺 m_bRun 鏄嬌鐢?volatile 淇グ絎︾殑錛寁olatile 淇グ絎︾殑浣滅敤鏄憡璇夌紪璇戝櫒鏃犻渶瀵硅鍙橀噺浣滀換浣曠殑浼樺寲錛屽嵆鏃犻渶灝嗗畠鏀懼埌涓涓瘎瀛樺櫒涓紝騫朵笖璇ュ煎彲琚閮ㄦ敼鍙樸傚浜庡綰跨▼寮曠敤鐨勫叏灞鍙橀噺鏉ヨ錛寁olatile 鏄竴涓潪甯擱噸瑕佺殑淇グ絎︺?/p>
緙栧啓綰跨▼鍑芥暟錛?void ThreadFunc()
{
CTime time;
CString strTime;
m_bRun=TRUE;
while(m_bRun)
{
time=CTime::GetCurrentTime();
strTime=time.Format("%H:%M:%S");
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);
Sleep(1000);
}
}
璇ョ嚎紼嬪嚱鏁版病鏈夊弬鏁幫紝涔熶笉榪斿洖鍑芥暟鍊箋傚彧瑕乵_bRun涓篢RUE錛岀嚎紼嬩竴鐩磋繍琛屻?/p>
鍙屽嚮IDC_START鎸夐挳錛屽畬鎴愯鎸夐挳鐨勬秷鎭嚱鏁幫細 void CMultiThread1Dlg::OnStart()
{
// TODO: Add your control notification handler code here
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
NULL,
0,
&ThreadID);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
}
鍙屽嚮IDC_STOP鎸夐挳錛屽畬鎴愯鎸夐挳鐨勬秷鎭嚱鏁幫細 void CMultiThread1Dlg::OnStop()
{
// TODO: Add your control notification handler code here
m_bRun=FALSE;
GetDlgItem(IDC_START)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}
緙栬瘧騫惰繍琛岃渚嬬▼錛屼綋浼氫嬌鐢╓in32 API緙栧啓鐨勫綰跨▼銆?
渚嬬▼2 MultiThread2
銆銆璇ョ嚎紼嬫紨紺轟簡濡備綍浼犻佷竴涓竴涓暣鍨嬬殑鍙傛暟鍒頒竴涓嚎紼嬩腑錛屼互鍙婂浣曠瓑寰呬竴涓嚎紼嬪畬鎴愬鐞嗐?/p>
寤虹珛涓涓熀浜庡璇濇鐨勫伐紼婱ultiThread2錛屽湪瀵硅瘽妗咺DD_MULTITHREAD2_DIALOG涓姞鍏ヤ竴涓紪杈戞鍜屼竴涓寜閽紝ID鍒嗗埆鏄疘DC_COUNT錛孖DC_START 錛屾寜閽帶浠剁殑鏍囬涓?#8220;寮濮?#8221;錛?
鍦∕ultiThread2Dlg.h鏂囦歡涓坊鍔犵嚎紼嬪嚱鏁板0鏄庯細 void ThreadFunc(int integer);
娉ㄦ剰錛岀嚎紼嬪嚱鏁扮殑澹版槑搴斿湪綾籆MultiThread2Dlg鐨勫閮ㄣ?/p>
鍦ㄧ被CMultiThread2Dlg鍐呴儴娣誨姞protected鍨嬪彉閲? HANDLE hThread;
DWORD ThreadID;
鍒嗗埆浠h〃綰跨▼鐨勫彞鏌勫拰ID銆?br>銆
鎵撳紑ClassWizard錛屼負緙栬緫妗咺DC_COUNT娣誨姞int鍨嬪彉閲弇_nCount銆傚湪MultiThread2Dlg.cpp鏂囦歡涓坊鍔狅細void ThreadFunc(int integer)
{
int i;
for(i=0;i<integer;i++)
{
Beep(200,50);
Sleep(1000);
}
}
鍙屽嚮IDC_START鎸夐挳錛屽畬鎴愯鎸夐挳鐨勬秷鎭嚱鏁幫細 void CMultiThread2Dlg::OnStart()
{
UpdateData(TRUE);
int integer=m_nCount;
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
(VOID*)integer,
0,
&ThreadID);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
WaitForSingleObject(hThread,INFINITE);
GetDlgItem(IDC_START)->EnableWindow(TRUE);
}
欏轟究璇翠竴涓媁aitForSingleObject鍑芥暟錛屽叾鍑芥暟鍘熷瀷涓猴細DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
hHandle涓鴻鐩戣鐨勫璞★紙涓鑸負鍚屾瀵硅薄錛屼篃鍙互鏄嚎紼嬶級鐨勫彞鏌勶紱
dwMilliseconds涓篽Handle瀵硅薄鎵璁劇疆鐨勮秴鏃跺鹼紝鍗曚綅涓烘縐掞紱
銆銆褰撳湪鏌愪竴綰跨▼涓皟鐢ㄨ鍑芥暟鏃訛紝綰跨▼鏆傛椂鎸傝搗錛岀郴緇熺洃瑙唄Handle鎵鎸囧悜鐨勫璞$殑鐘舵併傚鏋滃湪鎸傝搗鐨刣wMilliseconds姣鍐咃紝綰跨▼鎵絳夊緟鐨勫璞″彉涓烘湁淇″彿鐘舵侊紝鍒欒鍑芥暟绔嬪嵆榪斿洖錛涘鏋滆秴鏃舵椂闂村凡緇忓埌杈綿wMilliseconds姣錛屼絾hHandle鎵鎸囧悜鐨勫璞¤繕娌℃湁鍙樻垚鏈変俊鍙風姸鎬侊紝鍑芥暟鐓ф牱榪斿洖銆傚弬鏁癲wMilliseconds鏈変袱涓叿鏈夌壒孌婃剰涔夌殑鍊鹼細0鍜孖NFINITE銆傝嫢涓?錛屽垯璇ュ嚱鏁扮珛鍗寵繑鍥烇紱鑻ヤ負INFINITE錛屽垯綰跨▼涓鐩磋鎸傝搗錛岀洿鍒癶Handle鎵鎸囧悜鐨勫璞″彉涓烘湁淇″彿鐘舵佹椂涓烘銆?br>銆銆鏈緥紼嬭皟鐢ㄨ鍑芥暟鐨勪綔鐢ㄦ槸鎸変笅IDC_START鎸夐挳鍚庯紝涓鐩寸瓑鍒扮嚎紼嬭繑鍥烇紝鍐嶆仮澶岻DC_START鎸夐挳姝e父鐘舵併傜紪璇戣繍琛岃渚嬬▼騫剁粏蹇冧綋浼氥?/p>
渚嬬▼3 MultiThread3
浼犻佷竴涓粨鏋勪綋緇欎竴涓嚎紼嬪嚱鏁頒篃鏄彲鑳界殑錛屽彲浠ラ氳繃浼犻佷竴涓寚鍚戠粨鏋勪綋鐨勬寚閽堝弬鏁版潵瀹屾垚銆傚厛瀹氫箟涓涓粨鏋勪綋錛?
typedef struct
{
int firstArgu,
long secondArgu,
…
}myType,*pMyType;
鍒涘緩綰跨▼鏃禖reateThread(NULL,0,threadFunc,pMyType,…);
鍦╰hreadFunc鍑芥暟鍐呴儴錛屽彲浠ヤ嬌鐢?#8220;寮哄埗杞崲”錛?/p>
int intValue=((pMyType)lpvoid)->firstArgu;
long longValue=((pMyType)lpvoid)->seconddArgu;
……
渚嬬▼3 MultiThread3灝嗘紨紺哄浣曚紶閫佷竴涓寚鍚戠粨鏋勪綋鐨勬寚閽堝弬鏁般?
寤虹珛涓涓熀浜庡璇濇鐨勫伐紼婱ultiThread3錛屽湪瀵硅瘽妗咺DD_MULTITHREAD3_DIALOG涓姞鍏ヤ竴涓紪杈戞IDC_MILLISECOND錛屼竴涓寜閽甀DC_START錛屾爣棰樹負“寮濮?#8221; 錛屼竴涓繘搴︽潯IDC_PROGRESS1錛?
鎵撳紑ClassWizard錛屼負緙栬緫妗咺DC_MILLISECOND娣誨姞int鍨嬪彉閲弇_nMilliSecond錛屼負榪涘害鏉DC_PROGRESS1娣誨姞CProgressCtrl鍨嬪彉閲弇_ctrlProgress錛?
鍦∕ultiThread3Dlg.h鏂囦歡涓坊鍔犱竴涓粨鏋勭殑瀹氫箟錛?struct threadInfo
{
UINT nMilliSecond;
CProgressCtrl* pctrlProgress;
};
綰跨▼鍑芥暟鐨勫0鏄庯細 UINT ThreadFunc(LPVOID lpParam);
娉ㄦ剰錛屼簩鑰呭簲鍦ㄧ被CMultiThread3Dlg鐨勫閮ㄣ?
鍦ㄧ被CMultiThread3Dlg鍐呴儴娣誨姞protected鍨嬪彉閲? HANDLE hThread;
DWORD ThreadID;
鍒嗗埆浠h〃綰跨▼鐨勫彞鏌勫拰ID銆?
鍦∕ultiThread3Dlg.cpp鏂囦歡涓繘琛屽涓嬫搷浣滐細
瀹氫箟鍏叡鍙橀噺 threadInfo Info錛?br>鍙屽嚮鎸夐挳IDC_START錛屾坊鍔犵浉搴旀秷鎭鐞嗗嚱鏁幫細void CMultiThread3Dlg::OnStart()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
Info.nMilliSecond=m_nMilliSecond;
Info.pctrlProgress=&m_ctrlProgress;
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
&Info,
0,
&ThreadID);
/*
GetDlgItem(IDC_START)->EnableWindow(FALSE);
WaitForSingleObject(hThread,INFINITE);
GetDlgItem(IDC_START)->EnableWindow(TRUE);
*/
}
鍦ㄥ嚱鏁癇OOL CMultiThread3Dlg::OnInitDialog()涓坊鍔犺鍙ワ細 {
……
// TODO: Add extra initialization here
m_ctrlProgress.SetRange(0,99);
m_nMilliSecond=10;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
娣誨姞綰跨▼澶勭悊鍑芥暟錛歎INT ThreadFunc(LPVOID lpParam) {
threadInfo* pInfo=(threadInfo*)lpParam;
for(int i=0;i<100;i++)
{
int nTemp=pInfo->nMilliSecond;
pInfo->pctrlProgress->SetPos(i);
Sleep(nTemp);
}
return 0;
}
銆銆欏轟究琛ュ厖涓鐐癸紝濡傛灉浣犲湪void CMultiThread3Dlg::OnStart() 鍑芥暟涓坊鍔?* */璇彞錛岀紪璇戣繍琛屼綘灝變細鍙戠幇榪涘害鏉′笉榪涜鍒鋒柊錛屼富綰跨▼涔熷仠姝簡鍙嶅簲銆備粈涔堝師鍥犲憿錛熻繖鏄洜涓篧aitForSingleObject鍑芥暟絳夊緟瀛愮嚎紼嬶紙ThreadFunc錛夌粨鏉熸椂錛屽鑷翠簡綰跨▼姝婚攣銆傚洜涓篧aitForSingleObject鍑芥暟浼氬皢涓葷嚎紼嬫寕璧鳳紙浠諱綍娑堟伅閮藉緱涓嶅埌澶勭悊錛夛紝鑰屽瓙綰跨▼ThreadFunc姝e湪璁劇疆榪涘害鏉★紝涓鐩村湪絳夊緟涓葷嚎紼嬪皢鍒鋒柊娑堟伅澶勭悊瀹屾瘯榪斿洖鎵嶄細媯嫻嬮氱煡浜嬩歡銆傝繖鏍蜂袱涓嚎紼嬮兘鍦ㄤ簰鐩哥瓑寰咃紝姝婚攣鍙戠敓浜嗭紝緙栫▼鏃跺簲娉ㄦ剰閬垮厤銆?
渚嬬▼4 MultiThread4
璇ヤ緥紼嬫祴璇曞湪Windows涓嬫渶澶氬彲鍒涘緩綰跨▼鐨勬暟鐩?
寤虹珛涓涓熀浜庡璇濇鐨勫伐紼婱ultiThread4錛屽湪瀵硅瘽妗咺DD_MULTITHREAD4_DIALOG涓姞鍏ヤ竴涓寜閽甀DC_TEST鍜屼竴涓紪杈戞IDC_COUNT錛屾寜閽爣棰樹負“嫻嬭瘯” 錛?緙栬緫妗嗗睘鎬ч変腑Read-only錛?
鍦∕ultiThread4Dlg.cpp鏂囦歡涓繘琛屽涓嬫搷浣滐細
娣誨姞鍏叡鍙橀噺volatile BOOL m_bRunFlag=TRUE;
璇ュ彉閲忚〃紺烘槸鍚﹁繕鑳界戶緇垱寤虹嚎紼嬨?/p>
娣誨姞綰跨▼鍑芥暟錛?
DWORD WINAPI threadFunc(LPVOID threadNum)
{
while(m_bRunFlag)
{
Sleep(3000);
}
return 0;
}
鍙 m_bRunFlag 鍙橀噺涓篢RUE錛岀嚎紼嬩竴鐩磋繍琛屻?/p>
鍙屽嚮鎸夐挳IDC_TEST錛屾坊鍔犲叾鍝嶅簲娑堟伅鍑芥暟錛歷oid CMultiThread4Dlg::OnTest()
{
DWORD threadID;
GetDlgItem(IDC_TEST)->EnableWindow(FALSE);
long nCount=0;
while(m_bRunFlag)
{
if(CreateThread(NULL,0,threadFunc,NULL,0,&threadID)==NULL)
{
m_bRunFlag=FALSE;
break;
}
else
{
nCount++;
}
}
//涓嶆柇鍒涘緩綰跨▼錛岀洿鍒板啀涓嶈兘鍒涘緩涓烘
m_nCount=nCount;
UpdateData(FALSE);
Sleep(5000);
//寤舵椂5縐掞紝絳夊緟鎵鏈夊垱寤虹殑綰跨▼緇撴潫
GetDlgItem(IDC_TEST)->EnableWindow(TRUE);
m_bRunFlag=TRUE;
}
浜斻丮FC瀵瑰綰跨▼緙栫▼鐨勬敮鎸?/p>
銆銆MFC涓湁涓ょ被綰跨▼錛屽垎鍒О涔嬩負宸ヤ綔鑰呯嚎紼嬪拰鐢ㄦ埛鐣岄潰綰跨▼銆備簩鑰呯殑涓昏鍖哄埆鍦ㄤ簬宸ヤ綔鑰呯嚎紼嬫病鏈夋秷鎭驚鐜紝鑰岀敤鎴風晫闈㈢嚎紼嬫湁鑷繁鐨勬秷鎭槦鍒楀拰娑堟伅寰幆銆?br>銆銆宸ヤ綔鑰呯嚎紼嬫病鏈夋秷鎭満鍒訛紝閫氬父鐢ㄦ潵鎵ц鍚庡彴璁$畻鍜岀淮鎶や換鍔★紝濡傚啑闀跨殑璁$畻榪囩▼錛屾墦鍗版満鐨勫悗鍙版墦鍗扮瓑銆傜敤鎴風晫闈㈢嚎紼嬩竴鑸敤浜庡鐞嗙嫭绔嬩簬鍏朵粬綰跨▼鎵ц涔嬪鐨勭敤鎴瘋緭鍏ワ紝鍝嶅簲鐢ㄦ埛鍙婄郴緇熸墍浜х敓鐨勪簨浠跺拰娑堟伅絳夈備絾瀵逛簬Win32鐨凙PI緙栫▼鑰岃█錛岃繖涓ょ綰跨▼鏄病鏈夊尯鍒殑錛屽畠浠兘鍙渶綰跨▼鐨勫惎鍔ㄥ湴鍧鍗沖彲鍚姩綰跨▼鏉ユ墽琛屼換鍔°?br>銆銆鍦∕FC涓紝涓鑸敤鍏ㄥ眬鍑芥暟AfxBeginThread()鏉ュ垱寤哄茍鍒濆鍖栦竴涓嚎紼嬬殑榪愯錛岃鍑芥暟鏈変袱縐嶉噸杞藉艦寮忥紝鍒嗗埆鐢ㄤ簬鍒涘緩宸ヤ綔鑰呯嚎紼嬪拰鐢ㄦ埛鐣岄潰綰跨▼銆備袱縐嶉噸杞藉嚱鏁板師鍨嬪拰鍙傛暟鍒嗗埆璇存槑濡備笅錛?
(1) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
nPriority=THREAD_PRIORITY_NORMAL,
UINT nStackSize=0,
DWORD dwCreateFlags=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
PfnThreadProc:鎸囧悜宸ヤ綔鑰呯嚎紼嬬殑鎵ц鍑芥暟鐨勬寚閽堬紝綰跨▼鍑芥暟鍘熷瀷蹇呴』澹版槑濡備笅錛?UINT ExecutingFunction(LPVOID pParam);
璇鋒敞鎰忥紝ExecutingFunction()搴旇繑鍥炰竴涓猆INT綾誨瀷鐨勫鹼紝鐢ㄤ互鎸囨槑璇ュ嚱鏁扮粨鏉熺殑鍘熷洜銆備竴鑸儏鍐典笅錛岃繑鍥?琛ㄦ槑鎵ц鎴愬姛銆?
pParam錛氫紶閫掔粰綰跨▼鍑芥暟鐨勪竴涓?2浣嶅弬鏁幫紝鎵ц鍑芥暟灝嗙敤鏌愮鏂瑰紡瑙i噴璇ュ箋傚畠鍙互鏄暟鍊鹼紝鎴栨槸鎸囧悜涓涓粨鏋勭殑鎸囬拡錛岀敋鑷沖彲浠ヨ蹇界暐錛?
nPriority錛氱嚎紼嬬殑浼樺厛綰с傚鏋滀負0錛屽垯綰跨▼涓庡叾鐖剁嚎紼嬪叿鏈夌浉鍚岀殑浼樺厛綰э紱
nStackSize:綰跨▼涓鴻嚜宸卞垎閰嶅爢鏍堢殑澶у皬錛屽叾鍗曚綅涓哄瓧鑺傘傚鏋渘StackSize琚涓?錛屽垯綰跨▼鐨勫爢鏍堣璁劇疆鎴愪笌鐖剁嚎紼嬪爢鏍堢浉鍚屽ぇ灝忥紱
dwCreateFlags錛氬鏋滀負0錛屽垯綰跨▼鍦ㄥ垱寤哄悗绔嬪埢寮濮嬫墽琛屻傚鏋滀負CREATE_SUSPEND錛屽垯綰跨▼鍦ㄥ垱寤哄悗绔嬪埢琚寕璧鳳紱
lpSecurityAttrs錛氱嚎紼嬬殑瀹夊叏灞炴ф寚閽堬紝涓鑸負NULL錛?
(2) CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass,
int nPriority=THREAD_PRIORITY_NORMAL,
UINT nStackSize=0,
DWORD dwCreateFlags=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
銆銆pThreadClass 鏄寚鍚?CWinThread 鐨勪竴涓鍑虹被鐨勮繍琛屾椂綾誨璞$殑鎸囬拡錛岃瀵煎嚭綾誨畾涔変簡琚垱寤虹殑鐢ㄦ埛鐣岄潰綰跨▼鐨勫惎鍔ㄣ侀鍑虹瓑錛涘叾瀹冨弬鏁扮殑鎰忎箟鍚屽艦寮?銆備嬌鐢ㄥ嚱鏁扮殑榪欎釜鍘熷瀷鐢熸垚鐨勭嚎紼嬩篃鏈夋秷鎭満鍒訛紝鍦ㄤ互鍚庣殑渚嬪瓙涓垜浠皢鍙戠幇鍚屼富綰跨▼鐨勬満鍒跺嚑涔庝竴鏍楓?/p>
涓嬮潰鎴戜滑瀵笴WinThread綾葷殑鏁版嵁鎴愬憳鍙婂父鐢ㄥ嚱鏁拌繘琛岀畝瑕佽鏄庛?
m_hThread錛氬綋鍓嶇嚎紼嬬殑鍙ユ焺錛?
m_nThreadID:褰撳墠綰跨▼鐨処D錛?
m_pMainWnd錛氭寚鍚戝簲鐢ㄧ▼搴忎富紿楀彛鐨勬寚閽?
BOOL CWinThread::CreateThread(DWORD dwCreateFlags=0,
UINT nStackSize=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
銆銆璇ュ嚱鏁頒腑鐨刣wCreateFlags銆乶StackSize銆乴pSecurityAttrs鍙傛暟鍜孉PI鍑芥暟CreateThread涓殑瀵瑰簲鍙傛暟鏈夌浉鍚屽惈涔夛紝璇ュ嚱鏁版墽琛屾垚鍔燂紝榪斿洖闈?鍊鹼紝鍚﹀垯榪斿洖0銆?br>銆銆涓鑸儏鍐典笅錛岃皟鐢ˋfxBeginThread()鏉ヤ竴嬈℃у湴鍒涘緩騫跺惎鍔ㄤ竴涓嚎紼嬶紝浣嗘槸涔熷彲浠ラ氳繃涓ゆ娉曟潵鍒涘緩綰跨▼錛氶鍏堝垱寤篊WinThread綾葷殑涓涓璞★紝鐒跺悗璋冪敤璇ュ璞$殑鎴愬憳鍑芥暟CreateThread()鏉ュ惎鍔ㄨ綰跨▼銆?
virtual BOOL CWinThread::InitInstance();
銆銆閲嶈澆璇ュ嚱鏁頒互鎺у埗鐢ㄦ埛鐣岄潰綰跨▼瀹炰緥鐨勫垵濮嬪寲銆傚垵濮嬪寲鎴愬姛鍒欒繑鍥為潪0鍊鹼紝鍚﹀垯榪斿洖0銆傜敤鎴風晫闈㈢嚎紼嬬粡甯擱噸杞借鍑芥暟錛屽伐浣滆呯嚎紼嬩竴鑸笉浣跨敤InitInstance()銆?virtual int CWinThread::ExitInstance();
銆銆鍦ㄧ嚎紼嬬粓緇撳墠閲嶈澆璇ュ嚱鏁拌繘琛屼竴浜涘繀瑕佺殑娓呯悊宸ヤ綔銆傝鍑芥暟榪斿洖綰跨▼鐨勯鍑虹爜錛?琛ㄧず鎵ц鎴愬姛錛岄潪0鍊肩敤鏉ユ爣璇嗗悇縐嶉敊璇傚悓InitInstance()鎴愬憳鍑芥暟涓鏍鳳紝璇ュ嚱鏁頒篃鍙傜敤浜庣敤鎴風晫闈㈢嚎紼嬨?
鍏丮FC澶氱嚎紼嬬紪紼嬪疄渚?/p>
銆銆鍦╒isual C++ 6.0緙栫▼鐜涓紝鎴戜滑鏃㈠彲浠ョ紪鍐機椋庢牸鐨?2浣峎in32搴旂敤紼嬪簭錛屼篃鍙互鍒╃敤MFC綾誨簱緙栧啓C++椋庢牸鐨勫簲鐢ㄧ▼搴忥紝浜岃呭悇鏈夊叾浼樼己鐐廣傚熀浜嶹in32鐨勫簲鐢ㄧ▼搴忔墽琛屼唬鐮佸皬宸э紝榪愯鏁堢巼楂橈紝浣嗚姹傜▼搴忓憳緙栧啓鐨勪唬鐮佽緝澶氾紝涓旈渶瑕佺鐞嗙郴緇熸彁渚涚粰紼嬪簭鐨勬墍鏈夎祫婧愶紱鑰屽熀浜嶮FC綾誨簱鐨勫簲鐢ㄧ▼搴忓彲浠ュ揩閫熷緩绔嬭搗搴旂敤紼嬪簭錛岀被搴撲負紼嬪簭鍛樻彁渚涗簡澶ч噺鐨勫皝瑁呯被錛岃屼笖Developer Studio涓虹▼搴忓憳鎻愪緵浜嗕竴浜涘伐鍏鋒潵綆$悊鐢ㄦ埛婧愮▼搴忥紝鍏剁己鐐規槸綾誨簱浠g爜寰堝簽澶с傜敱浜庝嬌鐢ㄧ被搴撴墍甯︽潵鐨勫揩閫熴佺畝鎹峰拰鍔熻兘寮哄ぇ絳変紭瓚婃э紝鍥犳闄ら潪鏈夌壒孌婄殑闇瑕侊紝鍚﹀垯Visual C++鎺ㄨ崘浣跨敤MFC綾誨簱榪涜紼嬪簭寮鍙戙?/p>
鎴戜滑鐭ラ亾錛孧FC涓殑綰跨▼鍒嗕負涓ょ錛氱敤鎴風晫闈㈢嚎紼嬪拰宸ヤ綔鑰呯嚎紼嬨傛垜浠皢鍒嗗埆涓句緥璇存槑銆?/p>
鐢?MFC 綾誨簱緙栫▼瀹炵幇宸ヤ綔鑰呯嚎紼?/p>
渚嬬▼5 MultiThread5
涓轟簡涓嶹in32 API瀵圭収錛屾垜浠嬌鐢∕FC 綾誨簱緙栫▼瀹炵幇渚嬬▼3 MultiThread3銆?/p>
寤虹珛涓涓熀浜庡璇濇鐨勫伐紼婱ultiThread5錛屽湪瀵硅瘽妗咺DD_MULTITHREAD5_DIALOG涓姞鍏ヤ竴涓紪杈戞IDC_MILLISECOND錛屼竴涓寜閽甀DC_START錛屾爣棰樹負“寮濮?#8221; 錛屼竴涓繘搴︽潯IDC_PROGRESS1錛?
鎵撳紑ClassWizard錛屼負緙栬緫妗咺DC_MILLISECOND娣誨姞int鍨嬪彉閲弇_nMilliSecond錛屼負榪涘害鏉DC_PROGRESS1娣誨姞CProgressCtrl鍨嬪彉閲弇_ctrlProgress錛?
鍦∕ultiThread5Dlg.h鏂囦歡涓坊鍔犱竴涓粨鏋勭殑瀹氫箟錛?struct threadInfo
{
UINT nMilliSecond;
CProgressCtrl* pctrlProgress;
};
綰跨▼鍑芥暟鐨勫0鏄庯細UINT ThreadFunc(LPVOID lpParam);
娉ㄦ剰錛屼簩鑰呭簲鍦ㄧ被CMultiThread5Dlg鐨勫閮ㄣ?/p>
鍦ㄧ被CMultiThread5Dlg鍐呴儴娣誨姞protected鍨嬪彉閲忥細
CWinThread* pThread;
鍦∕ultiThread5Dlg.cpp鏂囦歡涓繘琛屽涓嬫搷浣滐細瀹氫箟鍏叡鍙橀噺錛歵hreadInfo Info;
鍙屽嚮鎸夐挳IDC_START錛屾坊鍔犵浉搴旀秷鎭鐞嗗嚱鏁幫細
void CMultiThread5Dlg::OnStart()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
Info.nMilliSecond=m_nMilliSecond;
Info.pctrlProgress=&m_ctrlProgress;
pThread=AfxBeginThread(ThreadFunc,
&Info);
}
鍦ㄥ嚱鏁癇OOL CMultiThread3Dlg::OnInitDialog()涓坊鍔犺鍙ワ細 {
……
// TODO: Add extra initialization here
m_ctrlProgress.SetRange(0,99);
m_nMilliSecond=10;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
娣誨姞綰跨▼澶勭悊鍑芥暟錛?UINT ThreadFunc(LPVOID lpParam)
{
threadInfo* pInfo=(threadInfo*)lpParam;
for(int i=0;i<100;i++)
{
int nTemp=pInfo->nMilliSecond;
pInfo->pctrlProgress->SetPos(i);
Sleep(nTemp);
}
return 0;
}
鐢?MFC 綾誨簱緙栫▼瀹炵幇鐢ㄦ埛鐣岄潰綰跨▼
鍒涘緩鐢ㄦ埛鐣岄潰綰跨▼鐨勬楠わ細
浣跨敤ClassWizard鍒涘緩綾籆WinThread鐨勬淳鐢熺被錛堜互CUIThread綾諱負渚嬶級 class CUIThread : public CWinThread
{
DECLARE_DYNCREATE(CUIThread)
protected:
CUIThread(); // protected constructor used by dynamic creation
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CUIThread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL
// Implementation
protected:
virtual ~CUIThread();
// Generated message map functions
//{{AFX_MSG(CUIThread)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
閲嶈澆鍑芥暟InitInstance()鍜孍xitInstance()銆?BOOL CUIThread::InitInstance()
{
CFrameWnd* wnd=new CFrameWnd;
wnd->Create(NULL,"UI Thread Window");
wnd->ShowWindow(SW_SHOW);
wnd->UpdateWindow();
m_pMainWnd=wnd;
return TRUE;
}
鍒涘緩鏂扮殑鐢ㄦ埛鐣岄潰綰跨▼ void CUIThreadDlg::OnButton1()
{
CUIThread* pThread=new CUIThread();
pThread->CreateThread();
}
璇鋒敞鎰忎互涓嬩袱鐐癸細
A銆佸湪UIThreadDlg.cpp鐨勫紑澶村姞鍏ヨ鍙ワ細 #include "UIThread.h"
B銆佹妸UIThread.h涓被CUIThread()鐨勬瀯閫犲嚱鏁扮殑鐗規х敱 protected 鏀逛負 public銆?
銆銆鐢ㄦ埛鐣岄潰綰跨▼鐨勬墽琛屾搴忎笌搴旂敤紼嬪簭涓葷嚎紼嬬浉鍚岋紝棣栧厛璋冪敤鐢ㄦ埛鐣岄潰綰跨▼綾葷殑InitInstance()鍑芥暟錛屽鏋滆繑鍥濼RUE錛岀戶緇皟鐢ㄧ嚎紼嬬殑Run()鍑芥暟錛岃鍑芥暟鐨勪綔鐢ㄦ槸榪愯涓涓爣鍑嗙殑娑堟伅寰幆錛屽茍涓斿綋鏀跺埌WM_QUIT娑堟伅鍚庝腑鏂紝鍦ㄦ秷鎭驚鐜繃紼嬩腑錛孯un()鍑芥暟媯嫻嬪埌綰跨▼絀洪棽鏃訛紙娌℃湁娑堟伅錛夛紝涔熷皢璋冪敤OnIdle()鍑芥暟錛屾渶鍚嶳un()鍑芥暟榪斿洖錛孧FC璋冪敤ExitInstance()鍑芥暟娓呯悊璧勬簮銆?br>銆銆浣犲彲浠ュ垱寤轟竴涓病鏈夌晫闈㈣屾湁娑堟伅寰幆鐨勭嚎紼嬶紝渚嬪錛氫綘鍙互浠嶤WinThread媧劇敓涓涓柊綾伙紝鍦↖nitInstance鍑芥暟涓畬鎴愭煇欏逛換鍔″茍榪斿洖FALSE錛岃繖琛ㄧず浠呮墽琛孖nitInstance鍑芥暟涓殑浠誨姟鑰屼笉鎵ц娑堟伅寰幆錛屼綘鍙互閫氳繃榪欑鏂規硶錛屽畬鎴愪竴涓伐浣滆呯嚎紼嬬殑鍔熻兘銆?
渚嬬▼6 MultiThread6
寤虹珛涓涓熀浜庡璇濇鐨勫伐紼婱ultiThread6錛屽湪瀵硅瘽妗咺DD_MULTITHREAD6_DIALOG涓姞鍏ヤ竴涓寜閽甀DC_UI_THREAD錛屾爣棰樹負“鐢ㄦ埛鐣岄潰綰跨▼”
鍙沖嚮宸ョ▼騫墮変腑“New Class…”涓哄伐紼嬫坊鍔犲熀綾諱負CWinThread媧劇敓綰跨▼綾籆UIThread銆?
緇欏伐紼嬫坊鍔犳柊瀵硅瘽妗咺DD_UITHREADDLG錛屾爣棰樹負“綰跨▼瀵硅瘽妗?#8221;銆?
涓哄璇濇IDD_UITHREADDLG鍒涘緩涓涓熀浜嶤Dialog鐨勭被CUIThreadDlg銆備嬌鐢–lassWizard涓篊UIThreadDlg綾繪坊鍔燱M_LBUTTONDOWN娑堟伅鐨勫鐞嗗嚱鏁癘nLButtonDown錛屽涓嬶細 void CUIThreadDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox("You Clicked The Left Button!");
CDialog::OnLButtonDown(nFlags, point);
}
鍦║IThread.h涓坊鍔?#include "UIThreadDlg.h"
騫跺湪CUIThread綾諱腑娣誨姞protected鍙橀噺CUIThread m_dlg錛?class CUIThread : public CWinThread
{
DECLARE_DYNCREATE(CUIThread)
protected:
CUIThread(); // protected constructor used by dynamic creation
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CUIThread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL
// Implementation
protected:
CUIThreadDlg m_dlg;
virtual ~CUIThread();
// Generated message map functions
//{{AFX_MSG(CUIThread)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
鍒嗗埆閲嶈澆InitInstance()鍑芥暟鍜孍xitInstance()鍑芥暟錛?BOOL CUIThread::InitInstance()
{
m_dlg.Create(IDD_UITHREADDLG);
m_dlg.ShowWindow(SW_SHOW);
m_pMainWnd=&m_dlg;
return TRUE;
}
int CUIThread::ExitInstance()
{
m_dlg.DestroyWindow();
return CWinThread::ExitInstance();
}
鍙屽嚮鎸夐挳IDC_UI_THREAD錛屾坊鍔犳秷鎭搷搴斿嚱鏁幫細 void CMultiThread6Dlg::OnUiThread()
{
CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CUIThread));
}
騫跺湪MultiThread6Dlg.cpp鐨勫紑澶存坊鍔狅細 #include "UIThread.h"
銆銆濂戒簡錛岀紪璇戝茍榪愯紼嬪簭鍚с傛瘡鍗曞嚮涓嬈?#8220;鐢ㄦ埛鐣岄潰綰跨▼”鎸夐挳錛岄兘浼氬脊鍑轟竴涓嚎紼嬪璇濇錛屽湪浠諱綍涓涓嚎紼嬪璇濇鍐呮寜涓嬮紶鏍囧乏閿紝閮戒細寮瑰嚭涓涓秷鎭銆?br>涓冦佺嚎紼嬮棿閫氳
銆銆涓鑸岃█,搴旂敤紼嬪簭涓殑涓涓瑕佺嚎紼嬫繪槸涓轟富綰跨▼鎵ц鐗瑰畾鐨勪換鍔?榪欐牱,涓葷嚎紼嬪拰嬈¤綰跨▼闂村繀瀹氭湁涓涓俊鎭紶閫掔殑娓犻亾,涔熷氨鏄富綰跨▼鍜屾瑕佺嚎紼嬮棿瑕佽繘琛岄氫俊銆傝繖縐嶇嚎紼嬮棿鐨勯氫俊涓嶄絾鏄毦浠ラ伩鍏嶇殑錛岃屼笖鍦ㄥ綰跨▼緙栫▼涓篃鏄鏉傚拰棰戠箒鐨勶紝涓嬮潰灝嗚繘琛岃鏄庛?
浣跨敤鍏ㄥ眬鍙橀噺榪涜閫氫俊
鐢變簬灞炰簬鍚屼竴涓繘紼嬬殑鍚勪釜綰跨▼鍏變韓鎿嶄綔緋葷粺鍒嗛厤璇ヨ繘紼嬬殑璧勬簮錛屾晠瑙e喅綰跨▼闂撮氫俊鏈綆鍗曠殑涓縐嶆柟娉曟槸浣跨敤鍏ㄥ眬鍙橀噺銆傚浜庢爣鍑嗙被鍨嬬殑鍏ㄥ眬鍙橀噺錛屾垜浠緩璁嬌鐢╲olatile 淇グ絎︼紝瀹冨憡璇夌紪璇戝櫒鏃犻渶瀵硅鍙橀噺浣滀換浣曠殑浼樺寲錛屽嵆鏃犻渶灝嗗畠鏀懼埌涓涓瘎瀛樺櫒涓紝騫朵笖璇ュ煎彲琚閮ㄦ敼鍙樸傚鏋滅嚎紼嬮棿鎵闇浼犻掔殑淇℃伅杈冨鏉傦紝鎴戜滑鍙互瀹氫箟涓涓粨鏋勶紝閫氳繃浼犻掓寚鍚戣緇撴瀯鐨勬寚閽堣繘琛屼紶閫掍俊鎭?br>銆
浣跨敤鑷畾涔夋秷鎭?/p>
鎴戜滑鍙互鍦ㄤ竴涓嚎紼嬬殑鎵ц鍑芥暟涓悜鍙︿竴涓嚎紼嬪彂閫佽嚜瀹氫箟鐨勬秷鎭潵杈懼埌閫氫俊鐨勭洰鐨勩備竴涓嚎紼嬪悜鍙﹀涓涓嚎紼嬪彂閫佹秷鎭槸閫氳繃鎿嶄綔緋葷粺瀹炵幇鐨勩傚埄鐢╓indows鎿嶄綔緋葷粺鐨勬秷鎭┍鍔ㄦ満鍒訛紝褰撲竴涓嚎紼嬪彂鍑轟竴鏉℃秷鎭椂錛屾搷浣滅郴緇熼鍏堟帴鏀跺埌璇ユ秷鎭紝鐒跺悗鎶婅娑堟伅杞彂緇欑洰鏍囩嚎紼嬶紝鎺ユ敹娑堟伅鐨勭嚎紼嬪繀欏誨凡緇忓緩绔嬩簡娑堟伅寰幆銆?
渚嬬▼7 MultiThread7
銆銆璇ヤ緥紼嬫紨紺轟簡濡備綍浣跨敤鑷畾涔夋秷鎭繘琛岀嚎紼嬮棿閫氫俊銆傞鍏堬紝涓葷嚎紼嬪悜CCalculateThread綰跨▼鍙戦佹秷鎭疻M_CALCULATE錛孋CalculateThread綰跨▼鏀跺埌娑堟伅鍚庤繘琛岃綆楋紝鍐嶅悜涓葷嚎紼嬪彂閫乄M_DISPLAY娑堟伅錛屼富綰跨▼鏀跺埌璇ユ秷鎭悗鏄劇ず璁$畻緇撴灉銆?
寤虹珛涓涓熀浜庡璇濇鐨勫伐紼婱ultiThread7錛屽湪瀵硅瘽妗咺DD_MULTITHREAD7_DIALOG涓姞鍏ヤ笁涓崟閫夋寜閽甀DC_RADIO1錛孖DC_RADIO2錛孖DC_RADIO3錛屾爣棰樺垎鍒負1+2+3+4+......+10錛?+2+3+4+......+50錛?+2+3+4+......+100銆傚姞鍏ユ寜閽甀DC_SUM錛屾爣棰樹負“姹傚拰”銆傚姞鍏ユ爣絳炬IDC_STATUS錛屽睘鎬ч変腑“杈規”錛?
鍦∕ultiThread7Dlg.h涓畾涔夊涓嬪彉閲忥細 protected:
int nAddend;
浠h〃鍔犳暟鐨勫ぇ灝忋?/p>
鍒嗗埆鍙屽嚮涓変釜鍗曢夋寜閽紝娣誨姞娑堟伅鍝嶅簲鍑芥暟錛歷oid CMultiThread7Dlg::OnRadio1()
{
nAddend=10;
}
void CMultiThread7Dlg::OnRadio2()
{
nAddend=50;
}
void CMultiThread7Dlg::OnRadio3()
{
nAddend=100;
}
騫跺湪OnInitDialog鍑芥暟涓畬鎴愮浉搴旂殑鍒濆鍖栧伐浣滐細 BOOL CMultiThread7Dlg::OnInitDialog()
{
……
((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);
nAddend=10;
……
鍦∕ultiThread7Dlg.h涓坊鍔狅細 #include "CalculateThread.h"
#define WM_DISPLAY WM_USER+2
class CMultiThread7Dlg : public CDialog
{
// Construction
public:
CMultiThread7Dlg(CWnd* pParent = NULL); // standard constructor
CCalculateThread* m_pCalculateThread;
……
protected:
int nAddend;
LRESULT OnDisplay(WPARAM wParam,LPARAM lParam);
……
鍦∕ultiThread7Dlg.cpp涓坊鍔狅細 BEGIN_MESSAGE_MAP(CMultiThread7Dlg, CDialog)
……
ON_MESSAGE(WM_DISPLAY,OnDisplay)
END_MESSAGE_MAP()
LRESULT CMultiThread7Dlg::OnDisplay(WPARAM wParam,LPARAM lParam)
{
int nTemp=(int)wParam;
SetDlgItemInt(IDC_STATUS,nTemp,FALSE);
return 0;
}
浠ヤ笂浠g爜浣垮緱涓葷嚎紼嬬被CMultiThread7Dlg鍙互澶勭悊WM_DISPLAY娑堟伅錛屽嵆鍦↖DC_STATUS鏍囩妗嗕腑鏄劇ず璁$畻緇撴灉銆?
鍙屽嚮鎸夐挳IDC_SUM錛屾坊鍔犳秷鎭搷搴斿嚱鏁幫細 void CMultiThread7Dlg::OnSum()
{
m_pCalculateThread=
(CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
Sleep(500);
m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);
}
OnSum()鍑芥暟鐨勪綔鐢ㄦ槸寤虹珛CalculateThread綰跨▼錛屽歡鏃剁粰璇ョ嚎紼嬪彂閫乄M_CALCULATE娑堟伅銆?
鍙沖嚮宸ョ▼騫墮変腑“New Class…”涓哄伐紼嬫坊鍔犲熀綾諱負 CWinThread 媧劇敓綰跨▼綾?CCalculateThread銆?/p>
鍦ㄦ枃浠禖alculateThread.h 涓坊鍔?#define WM_CALCULATE WM_USER+1
class CCalculateThread : public CWinThread
{
……
protected:
afx_msg LONG OnCalculate(UINT wParam,LONG lParam);
……
鍦ㄦ枃浠禖alculateThread.cpp涓坊鍔?LONG CCalculateThread::OnCalculate(UINT wParam,LONG lParam)
{
int nTmpt=0;
for(int i=0;i<=(int)wParam;i++)
{
nTmpt=nTmpt+i;
}
Sleep(500);
::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL);
return 0;
}
BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread)
//{{AFX_MSG_MAP(CCalculateThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)
//鍜屼富綰跨▼瀵規瘮錛屾敞鎰忓畠浠殑鍖哄埆
END_MESSAGE_MAP()
鍦–alculateThread.cpp鏂囦歡鐨勫紑澶存坊鍔犱竴鏉★細 #include "MultiThread7Dlg.h"
銆銆浠ヤ笂浠g爜涓恒CCalculateThread銆綾繪坊鍔犱簡 WM_CALCULATE 娑堟伅錛屾秷鎭殑鍝嶅簲鍑芥暟鏄?OnCalculate錛屽叾鍔熻兘鏄牴鎹弬鏁?wParam 鐨勫鹼紝榪涜绱姞錛岀瘡鍔犵粨鏋滃湪涓存椂鍙橀噺nTmpt涓紝寤舵椂0.5縐掞紝鍚戜富綰跨▼鍙戦乄M_DISPLAY娑堟伅榪涜鏄劇ず錛宯Tmpt浣滀負鍙傛暟浼犻掋?
緙栬瘧騫惰繍琛岃渚嬬▼,浣撲細濡備綍鍦ㄧ嚎紼嬮棿浼犻掓秷鎭?
鍏佺嚎紼嬬殑鍚屾
銆銆铏界劧澶氱嚎紼嬭兘緇欐垜浠甫鏉ュソ澶勶紝浣嗘槸涔熸湁涓嶅皯闂闇瑕佽В鍐熾備緥濡傦紝瀵逛簬鍍忕鐩橀┍鍔ㄥ櫒榪欐牱鐙崰鎬х郴緇熻祫婧愶紝鐢變簬綰跨▼鍙互鎵ц榪涚▼鐨勪換浣曚唬鐮佹錛屼笖綰跨▼鐨勮繍琛屾槸鐢辯郴緇熻皟搴﹁嚜鍔ㄥ畬鎴愮殑錛屽叿鏈変竴瀹氱殑涓嶇‘瀹氭э紝鍥犳灝辨湁鍙兘鍑虹幇涓や釜綰跨▼鍚屾椂瀵圭鐩橀┍鍔ㄥ櫒榪涜鎿嶄綔錛屼粠鑰屽嚭鐜版搷浣滈敊璇紱鍙堜緥濡傦紝瀵逛簬閾惰緋葷粺鐨勮綆楁満鏉ヨ錛屽彲鑳戒嬌鐢ㄤ竴涓嚎紼嬫潵鏇存柊鍏剁敤鎴鋒暟鎹簱錛岃岀敤鍙﹀涓涓嚎紼嬫潵璇誨彇鏁版嵁搴撲互鍝嶅簲鍌ㄦ埛鐨勯渶瑕侊紝鏋佹湁鍙兘璇繪暟鎹簱鐨勭嚎紼嬭鍙栫殑鏄湭瀹屽叏鏇存柊鐨勬暟鎹簱錛屽洜涓哄彲鑳藉湪璇葷殑鏃跺欏彧鏈変竴閮ㄥ垎鏁版嵁琚洿鏂拌繃銆?/p>
銆銆浣塊毝灞炰簬鍚屼竴榪涚▼鐨勫悇綰跨▼鍗忚皟涓鑷村湴宸ヤ綔縐頒負綰跨▼鐨勫悓姝ャ侻FC鎻愪緵浜嗗縐嶅悓姝ュ璞★紝涓嬮潰鎴戜滑鍙粙緇嶆渶甯哥敤鐨勫洓縐嶏細
涓寸晫鍖猴紙CCriticalSection錛?
浜嬩歡錛圕Event錛?
浜掓枼閲忥紙CMutex錛?
淇″彿閲忥紙CSemaphore錛?br>銆
閫氳繃榪欎簺綾伙紝鎴戜滑鍙互姣旇緝瀹規槗鍦板仛鍒扮嚎紼嬪悓姝ャ?
A銆佷嬌鐢?CCriticalSection 綾?
銆銆褰撳涓嚎紼嬭闂竴涓嫭鍗犳у叡浜祫婧愭椂,鍙互浣跨敤“涓寸晫鍖?#8221;瀵硅薄銆備換涓鏃跺埢鍙湁涓涓嚎紼嬪彲浠ユ嫢鏈変復鐣屽尯瀵硅薄錛屾嫢鏈変復鐣屽尯鐨勭嚎紼嬪彲浠ヨ闂淇濇姢璧鋒潵鐨勮祫婧愭垨浠g爜孌碉紝鍏朵粬甯屾湜榪涘叆涓寸晫鍖虹殑綰跨▼灝嗚鎸傝搗絳夊緟錛岀洿鍒版嫢鏈変復鐣屽尯鐨勭嚎紼嬫斁寮冧復鐣屽尯鏃朵負姝紝榪欐牱灝變繚璇佷簡涓嶄細鍦ㄥ悓涓鏃跺埢鍑虹幇澶氫釜綰跨▼璁塊棶鍏變韓璧勬簮銆?/p>
CCriticalSection綾葷殑鐢ㄦ硶闈炲父綆鍗曪紝姝ラ濡備笅錛?br>銆
瀹氫箟CCriticalSection綾葷殑涓涓叏灞瀵硅薄錛堜互浣垮悇涓嚎紼嬪潎鑳借闂級錛屽CCriticalSection critical_section錛?
鍦ㄨ闂渶瑕佷繚鎶ょ殑璧勬簮鎴栦唬鐮佷箣鍓嶏紝璋冪敤CCriticalSection綾葷殑鎴愬憳Lock錛堬級鑾峰緱涓寸晫鍖哄璞★細 critical_section.Lock();
鍦ㄧ嚎紼嬩腑璋冪敤璇ュ嚱鏁版潵浣跨嚎紼嬭幏寰楀畠鎵璇鋒眰鐨勪復鐣屽尯銆傚鏋滄鏃舵病鏈夊叾瀹冪嚎紼嬪崰鏈変復鐣屽尯瀵硅薄錛屽垯璋冪敤Lock()鐨勭嚎紼嬭幏寰椾復鐣屽尯錛涘惁鍒欙紝綰跨▼灝嗚鎸傝搗錛屽茍鏀懼叆鍒頒竴涓郴緇熼槦鍒椾腑絳夊緟錛岀洿鍒板綋鍓嶆嫢鏈変復鐣屽尯鐨勭嚎紼嬮噴鏀句簡涓寸晫鍖烘椂涓烘銆?
璁塊棶涓寸晫鍖哄畬姣曞悗錛屼嬌鐢–CriticalSection鐨勬垚鍛樺嚱鏁癠nlock()鏉ラ噴鏀句復鐣屽尯錛歝ritical_section.Unlock();
鍐嶉氫織涓鐐硅錛屽氨鏄嚎紼婣鎵ц鍒癱ritical_section.Lock();璇彞鏃訛紝濡傛灉鍏跺畠綰跨▼(B)姝e湪鎵цcritical_section.Lock();璇彞鍚庝笖critical_section. Unlock();璇彞鍓嶇殑璇彞鏃訛紝綰跨▼A灝變細絳夊緟錛岀洿鍒扮嚎紼婤鎵ц瀹宑ritical_section. Unlock();璇彞錛岀嚎紼婣鎵嶄細緇х畫鎵ц銆?
涓嬮潰鍐嶉氳繃涓涓疄渚嬭繘琛屾紨紺鴻鏄庛?/p>
渚嬬▼8 MultiThread8
寤虹珛涓涓熀浜庡璇濇鐨勫伐紼婱ultiThread8錛屽湪瀵硅瘽妗咺DD_MULTITHREAD8_DIALOG涓姞鍏ヤ袱涓寜閽拰涓や釜緙栬緫妗嗘帶浠訛紝涓や釜鎸夐挳鐨処D鍒嗗埆涓篒DC_WRITEW鍜孖DC_WRITED錛屾爣棰樺垎鍒負“鍐?#8216;W’”鍜?#8220;鍐?#8216;D’”錛涗袱涓紪杈戞鐨処D鍒嗗埆涓篒DC_W鍜孖DC_D錛屽睘鎬ч兘閫変腑Read-only錛?
鍦∕ultiThread8Dlg.h鏂囦歡涓0鏄庝袱涓嚎紼嬪嚱鏁幫細 UINT WriteW(LPVOID pParam);
UINT WriteD(LPVOID pParam);
浣跨敤ClassWizard鍒嗗埆緇橧DC_W鍜孖DC_D娣誨姞CEdit綾誨彉閲弇_ctrlW鍜宮_ctrlD錛?
鍦∕ultiThread8Dlg.cpp鏂囦歡涓坊鍔犲涓嬪唴瀹癸細
涓轟簡鏂囦歡涓兘澶熸紜嬌鐢ㄥ悓姝ョ被錛屽湪鏂囦歡寮澶存坊鍔狅細#include "afxmt.h"
瀹氫箟涓寸晫鍖哄拰涓涓瓧絎︽暟緇勶紝涓轟簡鑳藉鍦ㄤ笉鍚岀嚎紼嬮棿浣跨敤錛屽畾涔変負鍏ㄥ眬鍙橀噺錛欳CriticalSection critical_section;
char g_Array[10];
娣誨姞綰跨▼鍑芥暟錛歎INT WriteW(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
critical_section.Lock();
//閿佸畾涓寸晫鍖猴紝鍏跺畠綰跨▼閬囧埌critical_section.Lock();璇彞鏃惰絳夊緟
//鐩磋嚦鎵цcritical_section.Unlock();璇彞
for(int i=0;i<10;i++)
{
g_Array[i]=''W'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
critical_section.Unlock();
return 0;
}
UINT WriteD(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
critical_section.Lock();
//閿佸畾涓寸晫鍖猴紝鍏跺畠綰跨▼閬囧埌critical_section.Lock();璇彞鏃惰絳夊緟
//鐩磋嚦鎵цcritical_section.Unlock();璇彞
for(int i=0;i<10;i++)
{
g_Array[i]=''D'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
critical_section.Unlock();
return 0;
}
鍒嗗埆鍙屽嚮鎸夐挳IDC_WRITEW鍜孖DC_WRITED錛屾坊鍔犲叾鍝嶅簲鍑芥暟錛?void CMultiThread8Dlg::OnWritew()
{
CWinThread *pWriteW=AfxBeginThread(WriteW,
&m_ctrlW,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteW->ResumeThread();
}
void CMultiThread8Dlg::OnWrited()
{
CWinThread *pWriteD=AfxBeginThread(WriteD,
&m_ctrlD,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteD->ResumeThread();
}
鐢變簬浠g爜杈冪畝鍗曪紝涓嶅啀璇﹁堪銆傜紪璇戙佽繍琛岃渚嬬▼錛屾偍鍙互榪炵畫鐐瑰嚮涓や釜鎸夐挳錛岃瀵熶綋浼氫復鐣岀被鐨勪綔鐢ㄣ?
B銆佷嬌鐢?CEvent 綾?
銆銆CEvent 綾繪彁渚涗簡瀵逛簨浠剁殑鏀寔銆備簨浠舵槸涓涓厑璁鎬竴涓嚎紼嬪湪鏌愮鎯呭喌鍙戠敓鏃訛紝鍞ら啋鍙﹀涓涓嚎紼嬬殑鍚屾瀵硅薄銆備緥濡傚湪鏌愪簺緗戠粶搴旂敤紼嬪簭涓紝涓涓嚎紼嬶紙璁頒負A錛夎礋璐g洃鍚氳绔彛錛屽彟澶栦竴涓嚎紼嬶紙璁頒負B錛夎礋璐f洿鏂扮敤鎴鋒暟鎹傞氳繃浣跨敤CEvent 綾伙紝綰跨▼A鍙互閫氱煡綰跨▼B浣曟椂鏇存柊鐢ㄦ埛鏁版嵁銆傛瘡涓涓狢Event 瀵硅薄鍙互鏈変袱縐嶇姸鎬侊細鏈変俊鍙風姸鎬佸拰鏃犱俊鍙風姸鎬併傜嚎紼嬬洃瑙嗕綅浜庡叾涓殑CEvent 綾誨璞$殑鐘舵侊紝騫跺湪鐩稿簲鐨勬椂鍊欓噰鍙栫浉搴旂殑鎿嶄綔銆?br>銆銆鍦∕FC涓紝CEvent 綾誨璞℃湁涓ょ綾誨瀷錛氫漢宸ヤ簨浠跺拰鑷姩浜嬩歡銆備竴涓嚜鍔–Event 瀵硅薄鍦ㄨ鑷沖皯涓涓嚎紼嬮噴鏀懼悗浼氳嚜鍔ㄨ繑鍥炲埌鏃犱俊鍙風姸鎬侊紱鑰屼漢宸ヤ簨浠跺璞¤幏寰椾俊鍙峰悗錛岄噴鏀懼彲鍒╃敤綰跨▼錛屼絾鐩村埌璋冪敤鎴愬憳鍑芥暟ReSetEvent()鎵嶅皢鍏惰緗負鏃犱俊鍙風姸鎬併傚湪鍒涘緩CEvent 綾葷殑瀵硅薄鏃訛紝榛樿鍒涘緩鐨勬槸鑷姩浜嬩歡銆?CEvent 綾葷殑鍚勬垚鍛樺嚱鏁扮殑鍘熷瀷鍜屽弬鏁拌鏄庡涓嬶細
1銆丆Event(BOOL bInitiallyOwn=FALSE,
BOOL bManualReset=FALSE,
LPCTSTR lpszName=NULL,
LPSECURITY_ATTRIBUTES lpsaAttribute=NULL);
bInitiallyOwn:鎸囧畾浜嬩歡瀵硅薄鍒濆鍖栫姸鎬侊紝TRUE涓烘湁淇″彿錛孎ALSE涓烘棤淇″彿錛?
bManualReset錛氭寚瀹氳鍒涘緩鐨勪簨浠舵槸灞炰簬浜哄伐浜嬩歡榪樻槸鑷姩浜嬩歡銆俆RUE涓轟漢宸ヤ簨浠訛紝FALSE涓鴻嚜鍔ㄤ簨浠訛紱
鍚庝袱涓弬鏁頒竴鑸涓篘ULL錛屽湪姝や笉浣滆繃澶氳鏄庛?
2銆丅OOL CEvent錛氾細SetEvent();
銆銆灝?CEvent 綾誨璞$殑鐘舵佽緗負鏈変俊鍙風姸鎬併傚鏋滀簨浠舵槸浜哄伐浜嬩歡錛屽垯 CEvent 綾誨璞′繚鎸佷負鏈変俊鍙風姸鎬侊紝鐩村埌璋冪敤鎴愬憳鍑芥暟ResetEvent()灝?鍏墮噸鏂拌涓烘棤淇″彿鐘舵佹椂涓烘銆傚鏋淐Event 綾誨璞′負鑷姩浜嬩歡錛屽垯鍦⊿etEvent()灝嗕簨浠惰緗負鏈変俊鍙風姸鎬佸悗錛孋Event 綾誨璞$敱緋葷粺鑷姩閲嶇疆涓烘棤淇″彿鐘舵併?/p>
濡傛灉璇ュ嚱鏁版墽琛屾垚鍔燂紝鍒欒繑鍥為潪闆跺鹼紝鍚﹀垯榪斿洖闆躲?3銆丅OOL CEvent錛氾細ResetEvent();
銆銆璇ュ嚱鏁板皢浜嬩歡鐨勭姸鎬佽緗負鏃犱俊鍙風姸鎬侊紝騫朵繚鎸佽鐘舵佺洿鑷砈etEvent()琚皟鐢ㄦ椂涓烘銆傜敱浜庤嚜鍔ㄤ簨浠舵槸鐢辯郴緇熻嚜鍔ㄩ噸緗紝鏁呰嚜鍔ㄤ簨浠朵笉闇瑕佽皟鐢ㄨ鍑芥暟銆傚鏋滆鍑芥暟鎵ц鎴愬姛錛岃繑鍥為潪闆跺鹼紝鍚﹀垯榪斿洖闆躲傛垜浠竴鑸氳繃璋冪敤WaitForSingleObject鍑芥暟鏉ョ洃瑙嗕簨浠剁姸鎬併傚墠闈㈡垜浠凡緇忎粙緇嶄簡璇ュ嚱鏁般傜敱浜庤璦鎻忚堪鐨勫師鍥狅紝CEvent 綾葷殑鐞嗚В紜疄鏈変簺闅懼害錛屼絾鎮ㄥ彧瑕侀氳繃浠旂粏鐜╁懗涓嬮潰渚嬬▼錛屽鐪嬪嚑閬嶅氨鍙悊瑙c?
渚嬬▼9 MultiThread9
寤虹珛涓涓熀浜庡璇濇鐨勫伐紼婱ultiThread9錛屽湪瀵硅瘽妗咺DD_MULTITHREAD9_DIALOG涓姞鍏ヤ竴涓寜閽拰涓や釜緙栬緫妗嗘帶浠訛紝鎸夐挳鐨処D涓篒DC_WRITEW錛屾爣棰樹負“鍐?#8216;W’”錛涗袱涓紪杈戞鐨処D鍒嗗埆涓篒DC_W鍜孖DC_D錛屽睘鎬ч兘閫変腑Read-only;
鍦∕ultiThread9Dlg.h鏂囦歡涓0鏄庝袱涓嚎紼嬪嚱鏁幫細 UINT WriteW(LPVOID pParam);
UINT WriteD(LPVOID pParam);
浣跨敤ClassWizard鍒嗗埆緇橧DC_W鍜孖DC_D娣誨姞CEdit綾誨彉閲弇_ctrlW鍜宮_ctrlD錛?
鍦∕ultiThread9Dlg.cpp鏂囦歡涓坊鍔犲涓嬪唴瀹癸細
涓轟簡鏂囦歡涓兘澶熸紜嬌鐢ㄥ悓姝ョ被錛屽湪鏂囦歡寮澶存坊鍔?
#include "afxmt.h"
瀹氫箟浜嬩歡瀵硅薄鍜屼竴涓瓧絎︽暟緇勶紝涓轟簡鑳藉鍦ㄤ笉鍚岀嚎紼嬮棿浣跨敤錛屽畾涔変負鍏ㄥ眬鍙橀噺銆?CEvent eventWriteD;
char g_Array[10];
娣誨姞綰跨▼鍑芥暟錛?UINT WriteW(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
for(int i=0;i<10;i++)
{
g_Array[i]=''W'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
eventWriteD.SetEvent();
return 0;
}
UINT WriteD(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(eventWriteD.m_hObject,INFINITE);
for(int i=0;i<10;i++)
{
g_Array[i]=''D'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
return 0;
}
銆銆浠旂粏鍒嗘瀽榪欎袱涓嚎紼嬪嚱鏁? 鎮ㄥ氨浼氭紜悊瑙Event 綾匯傜嚎紼媁riteD鎵ц鍒?WaitForSingleObject(eventWriteD.m_hObject,INFINITE);澶勭瓑寰咃紝鐩村埌浜嬩歡eventWriteD涓烘湁淇″彿璇ョ嚎紼嬫墠寰涓嬫墽琛岋紝鍥犱負eventWriteD瀵硅薄鏄嚜鍔ㄤ簨浠訛紝鍒欏綋WaitForSingleObject()榪斿洖鏃訛紝緋葷粺鑷姩鎶奺ventWriteD瀵硅薄閲嶇疆涓烘棤淇″彿鐘舵併?
鍙屽嚮鎸夐挳IDC_WRITEW錛屾坊鍔犲叾鍝嶅簲鍑芥暟錛?void CMultiThread9Dlg::OnWritew()
{
CWinThread *pWriteW=AfxBeginThread(WriteW,
&m_ctrlW,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteW->ResumeThread();
CWinThread *pWriteD=AfxBeginThread(WriteD,
&m_ctrlD,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteD->ResumeThread();
}
緙栬瘧騫惰繍琛岀▼搴忥紝鍗曞嚮“鍐?#8216;W’”鎸夐挳錛屼綋浼氫簨浠跺璞$殑浣滅敤銆?
C銆佷嬌鐢–Mutex 綾?/p>
銆銆浜掓枼瀵硅薄涓庝復鐣屽尯瀵硅薄寰堝儚.浜掓枼瀵硅薄涓庝復鐣屽尯瀵硅薄鐨勪笉鍚屽湪浜?浜掓枼瀵硅薄鍙互鍦ㄨ繘紼嬮棿浣跨敤,鑰屼復鐣屽尯瀵硅薄鍙兘鍦ㄥ悓涓榪涚▼鐨勫悇綰跨▼闂翠嬌鐢ㄣ傚綋鐒訛紝浜掓枼瀵硅薄涔熷彲浠ョ敤浜庡悓涓榪涚▼鐨勫悇涓嚎紼嬮棿錛屼絾鏄湪榪欑鎯呭喌涓嬶紝浣跨敤涓寸晫鍖轟細鏇磋妭鐪佺郴緇熻祫婧愶紝鏇存湁鏁堢巼銆?/p>
D銆佷嬌鐢–Semaphore 綾?/p>
銆銆褰撻渶瑕佷竴涓鏁板櫒鏉ラ檺鍒跺彲浠ヤ嬌鐢ㄦ煇涓嚎紼嬬殑鏁扮洰鏃訛紝鍙互浣跨敤“淇″彿閲?#8221;瀵硅薄銆侰Semaphore 綾葷殑瀵硅薄淇濆瓨浜嗗褰撳墠璁塊棶鏌愪竴鎸囧畾璧勬簮鐨勭嚎紼嬬殑璁℃暟鍊鹼紝璇ヨ鏁板兼槸褰撳墠榪樺彲浠ヤ嬌鐢ㄨ璧勬簮鐨勭嚎紼嬬殑鏁扮洰銆傚鏋滆繖涓鏁拌揪鍒頒簡闆訛紝鍒欐墍鏈夊榪欎釜CSemaphore 綾誨璞℃墍鎺у埗鐨勮祫婧愮殑璁塊棶灝濊瘯閮借鏀懼叆鍒頒竴涓槦鍒椾腑絳夊緟錛岀洿鍒拌秴鏃舵垨璁℃暟鍊間笉涓洪浂鏃朵負姝€備竴涓嚎紼嬭閲婃斁宸茶闂簡琚繚鎶ょ殑璧勬簮鏃訛紝璁℃暟鍊煎噺1錛涗竴涓嚎紼嬪畬鎴愪簡瀵硅鎺у叡浜祫婧愮殑璁塊棶鏃訛紝璁℃暟鍊煎1銆傝繖涓CSemaphore 綾誨璞℃墍鎺у埗鐨勮祫婧愬彲浠ュ悓鏃舵帴鍙楄闂殑鏈澶х嚎紼嬫暟鍦ㄨ瀵硅薄鐨勬瀯寤哄嚱鏁頒腑鎸囧畾銆?/p>
CSemaphore 綾葷殑鏋勯犲嚱鏁板師鍨嬪強鍙傛暟璇存槑濡備笅錛?
CSemaphore (LONG lInitialCount=1,
LONG lMaxCount=1,
LPCTSTR pstrName=NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes=NULL);
lInitialCount:淇″彿閲忓璞$殑鍒濆璁℃暟鍊鹼紝鍗沖彲璁塊棶綰跨▼鏁扮洰鐨勫垵濮嬪鹼紱
lMaxCount錛氫俊鍙烽噺瀵硅薄璁℃暟鍊肩殑鏈澶у鹼紝璇ュ弬鏁板喅瀹氫簡鍚屼竴鏃跺埢鍙闂敱淇″彿閲忎繚鎶ょ殑璧勬簮鐨勭嚎紼嬫渶澶ф暟鐩紱
鍚庝袱涓弬鏁板湪鍚屼竴榪涚▼涓嬌鐢ㄤ竴鑸負NULL錛屼笉浣滆繃澶氳璁猴紱
銆銆鍦ㄧ敤CSemaphore 綾葷殑鏋勯犲嚱鏁板垱寤轟俊鍙烽噺瀵硅薄鏃惰鍚屾椂鎸囧嚭鍏佽鐨勬渶澶ц祫婧愯鏁板拰褰撳墠鍙敤璧勬簮璁℃暟銆備竴鑸槸灝嗗綋鍓嶅彲鐢ㄨ祫婧愯鏁拌緗負鏈澶ц祫婧愯鏁幫紝姣忓鍔犱竴涓嚎紼嬪鍏變韓璧勬簮鐨勮闂紝褰撳墠鍙敤璧勬簮璁℃暟灝變細鍑?錛屽彧瑕佸綋鍓嶅彲鐢ㄨ祫婧愯鏁版槸澶т簬0鐨勶紝灝卞彲浠ュ彂鍑轟俊鍙烽噺淇″彿銆備絾鏄綋鍓嶅彲鐢ㄨ鏁板噺灝忓埌0鏃訛紝鍒欒鏄庡綋鍓嶅崰鐢ㄨ祫婧愮殑綰跨▼鏁板凡緇忚揪鍒頒簡鎵鍏佽鐨勬渶澶ф暟鐩紝涓嶈兘鍐嶅厑璁稿叾瀹冪嚎紼嬬殑榪涘叆錛屾鏃剁殑淇″彿閲忎俊鍙峰皢鏃犳硶鍙戝嚭銆傜嚎紼嬪湪澶勭悊瀹屽叡浜祫婧愬悗錛屽簲鍦ㄧ寮鐨勫悓鏃墮氳繃ReleaseSemaphore()鍑芥暟灝嗗綋鍓嶅彲鐢ㄨ祫婧愭暟鍔?銆?/p>
涓嬮潰緇欏嚭涓涓畝鍗曞疄渚嬫潵璇存槑 CSemaphore 綾葷殑鐢ㄦ硶銆?/p>
渚嬬▼10 MultiThread10
寤虹珛涓涓熀浜庡璇濇鐨勫伐紼婱ultiThread10錛屽湪瀵硅瘽妗咺DD_MULTITHREAD10_DIALOG涓姞鍏ヤ竴涓寜閽拰涓変釜緙栬緫妗嗘帶浠訛紝鎸夐挳鐨処D涓篒DC_START錛屾爣棰樹負“鍚屾椂鍐?#8216;A’銆?#8216;B’銆?#8216;C’”錛涗笁涓紪杈戞鐨処D鍒嗗埆涓篒DC_A銆両DC_B鍜孖DC_C錛屽睘鎬ч兘閫変腑Read-only錛?
鍦∕ultiThread10Dlg.h鏂囦歡涓0鏄庝袱涓嚎紼嬪嚱鏁幫細 UINT WriteA(LPVOID pParam);
UINT WriteB(LPVOID pParam);
UINT WriteC(LPVOID pParam);
浣跨敤ClassWizard鍒嗗埆緇橧DC_A銆両DC_B鍜孖DC_C娣誨姞CEdit綾誨彉閲弇_ctrlA銆乵_ctrlB鍜宮_ctrlC錛?
鍦∕ultiThread10Dlg.cpp鏂囦歡涓坊鍔犲涓嬪唴瀹癸細
涓轟簡鏂囦歡涓兘澶熸紜嬌鐢ㄥ悓姝ョ被錛屽湪鏂囦歡寮澶存坊鍔狅細
#include "afxmt.h"
瀹氫箟淇″彿閲忓璞″拰涓涓瓧絎︽暟緇勶紝涓轟簡鑳藉鍦ㄤ笉鍚岀嚎紼嬮棿浣跨敤錛屽畾涔変負鍏ㄥ眬鍙橀噺錛欳Semaphore semaphoreWrite(2,2); //璧勬簮鏈澶氳闂嚎紼?涓紝褰撳墠鍙闂嚎紼嬫暟2涓?
char g_Array[10];
娣誨姞涓変釜綰跨▼鍑芥暟錛?
UINT WriteA(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i<10;i++)
{
pEdit->GetWindowText(str);
g_Array[i]=''A'';
str=str+g_Array[i];
pEdit->SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
UINT WriteB(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i<10;i++)
{
pEdit->GetWindowText(str);
g_Array[i]=''B'';
str=str+g_Array[i];
pEdit->SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
UINT WriteC(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
for(int i=0;i<10;i++)
{
g_Array[i]=''C'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
榪欎笁涓嚎紼嬪嚱鏁頒笉鍐嶅璇淬傚湪淇″彿閲忓璞℃湁淇″彿鐨勭姸鎬佷笅錛岀嚎紼嬫墽琛屽埌WaitForSingleObject璇彞澶勭戶緇墽琛岋紝鍚屾椂鍙敤綰跨▼鏁板噺1錛涜嫢綰跨▼鎵ц鍒癢aitForSingleObject璇彞鏃朵俊鍙烽噺瀵硅薄鏃犱俊鍙鳳紝綰跨▼灝卞湪榪欓噷絳夊緟錛岀洿鍒頒俊鍙烽噺瀵硅薄鏈変俊鍙風嚎紼嬫墠寰涓嬫墽琛屻?
鍙屽嚮鎸夐挳IDC_START錛屾坊鍔犲叾鍝嶅簲鍑芥暟錛?void CMultiThread10Dlg::OnStart()
{
CWinThread *pWriteA=AfxBeginThread(WriteA,
&m_ctrlA,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteA->ResumeThread();
CWinThread *pWriteB=AfxBeginThread(WriteB,
&m_ctrlB,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteB->ResumeThread();
CWinThread *pWriteC=AfxBeginThread(WriteC,
&m_ctrlC,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteC->ResumeThread();
}
濂藉惂錛屽綰跨▼緙栫▼灝變粙緇嶅埌榪欓噷錛屽笇鏈涙湰鏂囪兘瀵規偍鏈夋墍甯姪銆?br>