锘??xml version="1.0" encoding="utf-8" standalone="yes"?>精品国产乱码久久久久久1区2区,久久人人爽人人爽人人片av麻烦,久久99九九国产免费看小说 http://www.shnenglu.com/ant/category/4993.htmlThe dreams in which I'm dying are the best I've ever had... zh-cn Thu, 20 May 2010 06:43:56 GMT Thu, 20 May 2010 06:43:56 GMT 60 鑵捐騫垮窞鎷涜仒鎵嬫満瀹㈡埛绔紑鍙戜漢鍛?/title> http://www.shnenglu.com/ant/archive/2010/05/19/115846.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Wed, 19 May 2010 14:14:00 GMT http://www.shnenglu.com/ant/archive/2010/05/19/115846.html http://www.shnenglu.com/ant/comments/115846.html http://www.shnenglu.com/ant/archive/2010/05/19/115846.html#Feedback 0 http://www.shnenglu.com/ant/comments/commentRss/115846.html http://www.shnenglu.com/ant/services/trackbacks/115846.html 濂戒箙娌℃洿鏂版棩蹇椾簡錛屽彂涓鍒欏皬鎷涜仒騫垮憡錛?br /> 聽聽聽 鑵捐騫垮窞鎷涜仒鎵嬫満瀹㈡埛绔紑鍙戜漢鍛?br />聽聽聽 鍩烘湰瑕佹眰錛?br />聽聽聽 1).1锝?騫村伐浣滅粡楠岋紱 聽聽聽 2).鏈塖ymbian/Andriod/iPhone鎵嬫満瀹㈡埛绔紑鍙戠粡楠?鏈塖ymbian C++寮鍙戠粡楠岃呬紭鍏?錛?/b> 鏈夋剰鍚戣呰鑱旂郴錛歱eterfan@tencent.com
]]> Win32 Service鐨勭畝鍗曞皝瑁?/title> http://www.shnenglu.com/ant/archive/2007/09/24/32769.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Mon, 24 Sep 2007 05:01:00 GMT http://www.shnenglu.com/ant/archive/2007/09/24/32769.html http://www.shnenglu.com/ant/comments/32769.html http://www.shnenglu.com/ant/archive/2007/09/24/32769.html#Feedback 5 http://www.shnenglu.com/ant/comments/commentRss/32769.html http://www.shnenglu.com/ant/services/trackbacks/32769.html 鍓嶆鏃墮棿瀛︿範Windows紼嬪簭璁捐錛屽垰濂藉鍒癢in32 Service錛屼簬鏄啓浜嗕袱涓畝鍗曠殑綾伙細BaseService鍜孲erviceCtrl銆傝櫧鐒跺姛鑳芥瘮杈冪畝鍗曪紝浣嗘槸涔熻兘閫傜敤浜庡ぇ澶氭暟鎯呭喌銆備笅闈粙緇嶄竴涓嬬畝鍗曠敤娉曪紝濡傛灉浣犲垰濂介渶瑕佸啓涓浜涚畝鍗曠殑鏈嶅姟紼嬪簭錛岃繖涓や釜綾諱篃璁歌兘媧句笂鐢ㄥ満錛?br>1. BaseService BaseService.h
1 #ifndef BASE_SERVICE_H 2 #define BASE_SERVICE_H 3 4 class BaseService { 5 public : 6 explicit BaseService(LPCTSTR szServiceName, 7 DWORD dwServiceType = SERVICE_WIN32_OWN_PROCESS, 8 DWORD dwStartType = SERVICE_AUTO_START); 9 virtual ~ BaseService() {} 10 bool ParseStandardArgs( int argc, char * argv[]); 11 bool IsInstalled(); 12 bool Install(); 13 bool Uninstall(); 14 bool Start(); 15 private : 16 virtual void Run() = 0 ; 17 virtual bool OnInitialize() { return true ; } 18 virtual void OnStop() {} 19 virtual void OnPause() {} 20 virtual void OnContinue() {} 21 virtual void OnInterrogate() {} 22 virtual void OnShutdown() {} 23 virtual void OnUserControl(DWORD dwControl) {} 24 ... 25 }; 26 27 #endif /* BASE_SERVICE_H */
瑕佸疄鐜拌嚜宸辯殑鏈嶅姟綾誨彧闇浠嶣aseService緇ф壙騫朵笖Override鐩稿叧鐨剉irtual鍑芥暟鍗沖彲錛屼笅闈㈢ず鑼冧竴涓狟eepService綾伙紝璇ユ湇鍔″彧鏄畝鍗曞湴姣忛殧2縐抌eep涓涓嬶紝涓轟簡綆鍗曟墍鏈変唬鐮佸潎鏀懼湪.h鏂囦歡涓細BeepService.h
1 #ifndef BEEP_SERVICE_H 2 #define BEEP_SERVICE_H 3 4 #include " BaseService.h " 5 6 class BeepService : public BaseService { 7 public : 8 BeepService(LPCTSTR szServiceName) 9 :BaseService(szServiceName) 10 ,m_bPaused( false ) 11 ,m_bRunning( false ) {} 12 13 virtual void OnStop() { m_bRunning = false ; } 14 virtual void OnPause() { m_bPaused = true ; } 15 virtual void OnContinue() { m_bPaused = false ; } 16 virtual void Run() { 17 m_bRunning = true ; 18 while (m_bRunning) { 19 if ( ! m_bPaused) 20 Beep( 800 , 800 ); 21 Sleep( 2000 ); 22 } 23 } 24 private : 25 volatile bool m_bPaused; 26 volatile bool m_bRunning; 27 }; 28 29 #endif /* BEEP_SERVICE_H */
閫氬父鏉ヨ鍙』瑕丱verride涓婇潰鐨?涓獀irtual鍑芥暟灝監K浜嗭細 鍦?em>Run()涓繘琛屽疄闄呯殑宸ヤ綔錛?em>OnStop(),OnPause(),OnContinue()鍒欐槸涓轟簡鍝嶅簲Service Control Manager鐨勬帶鍒躲?br> test.cpp
1 #include < windows.h > 2 #include < tchar.h > 3 #include < stdio.h > 4 #include " BeepService.h " 5 6 int main( int argc, char * argv[]) { 7 8 BeepService beepService(_T( " BeepService " )); 9 if ( ! beepService.ParseStandardArgs(argc, argv)) { 10 if (beepService.IsInstalled()) { 11 if ( ! beepService.Start()) 12 printf( " The service can not run from command line.\n " ); 13 } else { 14 printf( " The service is not installed, " 15 " use \ " % s - i\ " to install.\n " , argv[ 0 ]); 16 } 17 } 18 return 0 ; 19 }
鍋囪緙栬瘧鍚庣敓鎴愮殑exe鏂囦歡涓篵eep.exe錛屽垯鍦ㄥ懡浠よ涓彲浠ュ涓嬩嬌鐢細(1). beep -i 瀹夎service(瀹夎浠ュ悗緋葷粺榪愯鏃朵細鑷姩鍚姩) (2). beep -u 鍗歌澆service(濡傛灉service姝e湪榪愯錛屽垯鍏堝仠姝ervice鍐嶅嵏杞? BaseServiced 鐨凱arseStandardArgs姝f槸鐢ㄦ潵瑙f瀽涓婅堪涓や釜鍛戒護銆?br>2. ServiceCtrl 铏界劧Windows鑷甫鐨凷ervice Control Manager鍙互鎺у埗鏈嶅姟紼嬪簭錛屼絾鏄緢澶氭椂鍊欐垜浠兘闇瑕佺敤浠g爜鎺у埗錛岃繖灝辯敤鍒癝erviceCtrl綾伙紝璇ョ被鐨勬帴鍙e涓嬶細ServiceCtrl.h
1 #ifndef SERVICE_CTRL_H 2 #define SERVICE_CTRL_H 3 4 class ServiceCtrl { 5 public : 6 ServiceCtrl(LPCTSTR szServiceName); 7 ~ ServiceCtrl(); 8 bool Start(); 9 bool Pause(); 10 bool Continue(); 11 bool Stop(); 12 bool Interrogate(); 13 bool UserControl(DWORD dwControl); 14 DWORD State() const ; 15 ... 16 }; 17 18 #endif /* SERVICE_CTRL_H */
鎺ュ彛姣旇緝鐩磋娌′粈涔堝ソ璇寸殑錛岀湅涓嬮潰鐨勭ず渚嬩唬鐮侊細test.cpp
1 #include < windows.h > 2 #include < tchar.h > 3 #include < stdio.h > 4 #include < exception > 5 #include " BeepService.h " 6 #include " ServiceCtrl.h " 7 8 int main( int argc, char * argv[]) { 9 10 try { 11 ServiceCtrl servCtrl(_T( " BeepService " )); 12 if (servCtrl.State() != SERVICE_STOPPED) { 13 printf( " Service already started.\n " ); 14 } else { 15 servCtrl.Start(); 16 printf( " Start.\n " ); 17 Sleep( 6000 ); 18 servCtrl.Pause(); 19 printf( " Pause.\n " ); 20 Sleep( 6000 ); 21 servCtrl.Continue(); 22 printf( " Continue.\n " ); 23 Sleep( 6000 ); 24 servCtrl.Stop(); 25 printf( " Stop.\n " ); 26 } 27 } catch (std::exception & e) { 28 printf( " %s\n " , e.what()); 29 } 30 return 0 ; 31 }
婧愪唬鐮侊細鐐瑰嚮涓嬭澆
]]>浠嶹in32 API灝佽Thread綾籟2] http://www.shnenglu.com/ant/archive/2007/08/31/31280.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Fri, 31 Aug 2007 03:58:00 GMT http://www.shnenglu.com/ant/archive/2007/08/31/31280.html http://www.shnenglu.com/ant/comments/31280.html http://www.shnenglu.com/ant/archive/2007/08/31/31280.html#Feedback 6 http://www.shnenglu.com/ant/comments/commentRss/31280.html http://www.shnenglu.com/ant/services/trackbacks/31280.html (functor 聽and function object )浣滀負鏋勯犲嚱鏁板弬鏁般傚鏋滀綘鐔熸倝STL錛屼綘搴旇鐔熸倝bind1st鍜宐ind2nd榪欎袱涓嚱鏁伴厤鎺ュ櫒(function adapter )錛宐ind1st鍜宐ind2nd鍙互灝嗕竴涓簩鍏冨嚱鏁?binary function )杞崲鎴愪竴鍏冨嚱鏁?unary function )銆備負浜嗕嬌Thread綾昏兘澶熺敤鏅氬嚱鏁板拰鍑芥暟瀵硅薄浣滀負鍙傛暟錛屾垜浠渶瑕佷竴涓猙ind灝嗕竴鍏冨嚱鏁拌漿鎹㈡垚鏃犲弬鍑芥暟錛?br />bind.h 聽1 聽#ifndef聽BIND_H 聽2 聽#define聽BIND_H 聽3 聽聽4 聽template聽 < class 聽_Result > 聽5 聽struct聽trivial_function聽{ 聽6 聽聽聽聽聽typedef聽_Result聽result_type; 聽7 聽}; 聽8 聽聽9 聽template聽 < class 聽_Operation > 10 聽class 聽binder聽:聽 public 聽trivial_function < typename聽_Operation::result_type > 聽{ 11 聽public : 12 聽聽聽聽聽binder( const 聽_Operation & x,聽 const 聽typename聽_Operation::argument_type & y) 13 聽聽聽聽聽聽聽聽聽:op(x),聽value(y)聽{} 14 聽聽聽聽聽typename聽_Operation::result_type聽operator()()聽 const 聽{ 15 聽聽聽聽聽聽聽聽聽 return 聽op(value); 16 聽聽聽聽聽} 17 聽protected : 18 聽聽聽聽聽_Operation聽op; 19 聽聽聽聽聽typename聽_Operation::argument_type聽value; 20 聽}; 21 聽22 聽template聽 < class 聽_Operation,聽 class 聽_Tp > 23 聽inline聽binder < _Operation > 聽 24 聽bind( const 聽_Operation & 聽__fn,聽 const 聽_Tp & 聽__x)聽 25 聽{ 26 聽聽聽聽聽typedef聽typename聽_Operation::argument_type聽_Arg_type; 27 聽聽聽聽聽 return 聽binder < _Operation > (__fn,聽_Arg_type(__x)); 28 聽} 29 聽30 聽#endif /* BIND_H */
鏈変簡bind鎴戜滑榪橀渶瑕佷慨鏀筎hread綾葷殑鏋勯犲嚱鏁幫紝鏄劇劧鎴戜滑蹇呴』灝嗘瀯閫犲嚱鏁板0鏄庝負鎴愬憳妯℃澘(榪樻湁涓縐嶆柟娉曚篃鍙互杈懼埌鍚屾牱鐨勭洰鐨勶紝灝辨槸鎶奣hread綾誨0鏄庝負妯℃澘錛屼絾鏄繖鏍風殑璁捐濂藉儚涓嶅お濂?錛岃繖鏍鋒墠鑳藉璁㏕hread綾葷殑鏋勯犲嚱鏁板彲浠ユ帴鍙楀悇縐嶇被鍨嬬殑鍙傛暟錛屼慨鏀瑰悗鐨勬瀯閫犲嚱鏁板簲璇ヨ兘澶熶嬌鐢ㄥ涓嬩笁縐嶇被鍨嬬殑鍙傛暟錛?br />1.Runnable * 2.no argument function 3.no argument functor 涓嬮潰鏄慨鏀瑰悗鐨勫ご鏂囦歡錛?br />runnable.h 聽1 聽#ifndef聽RUNNABLE_H 聽2 聽#define聽RUNNABLE_H 聽3 聽聽4 聽struct聽Runnable聽{ 聽5 聽聽聽聽聽virtual聽 void 聽run()聽 = 聽 0 ; 聽6 聽聽聽聽聽virtual聽 ~ Runnable()聽{} 聽7 聽}; 聽8 聽聽9 聽template聽 < class 聽T > 10 聽class 聽RunnableFunctor聽:聽 public 聽Runnable聽{ 11 聽public : 12 聽聽聽聽聽RunnableFunctor( const 聽T & f)聽:_func(f)聽{} 13 聽聽聽聽聽virtual聽 void 聽run()聽{聽_func();聽} 14 聽private : 15 聽聽聽聽聽T聽_func; 16 聽}; 17 聽18 聽// base聽template聽for聽no聽argument聽functor 19 聽template聽 < class 聽T > 20 聽struct聽FuncImpl聽{ 21 聽聽聽聽聽 static 聽Runnable * 聽transfer( const 聽T & t)聽{ 22 聽聽聽聽聽聽聽聽聽 return 聽 new 聽RunnableFunctor < T > (t); 23 聽聽聽聽聽} 24 聽}; 25 聽26 聽// partial聽specialization聽for聽T* 27 聽template聽 < class 聽T > 28 聽struct聽FuncImpl < T *> 聽{ 29 聽聽聽聽聽 static 聽Runnable * 聽transfer(T * t)聽{ 30 聽聽聽聽聽聽聽聽聽 return 聽t; 31 聽聽聽聽聽} 32 聽}; 33 聽34 聽// partial聽specialization聽for聽no聽argument聽function 35 聽template聽 < class 聽T > 36 聽struct聽FuncImpl < T聽( * )() > 聽{ 37 聽聽聽聽聽 static 聽Runnable * 聽transfer(T聽( * t)())聽{ 38 聽聽聽聽聽聽聽聽聽 return 聽 new 聽RunnableFunctor < T聽( * )() > (t); 39 聽聽聽聽聽} 40 聽}; 41 聽42 聽template聽 < class 聽T > 43 聽inline聽Runnable * 聽transfer( const 聽T & t)聽{ 44 聽聽聽聽聽 return 聽FuncImpl < T > ::transfer(t); 45 聽} 46 聽47 聽#endif /* RUNNABLE_H */
thread.h 聽1 聽#ifndef聽THREAD_H 聽2 聽#define聽THREAD_H 聽3 聽聽4 聽#include聽 < windows.h > 聽5 聽#include聽 " bind.h " 聽6 聽#include聽 " runnable.h " 聽7 聽聽8 聽#define聽CLASS_UNCOPYABLE(classname)聽\ 聽9 聽聽聽聽聽 private :聽\ 10 聽聽聽聽聽classname( const 聽classname & );聽\ 11 聽聽聽聽聽classname & 聽operator = ( const 聽classname & ); 12 聽13 聽class 聽Thread聽:聽 public 聽Runnable聽{ 14 聽聽聽聽聽CLASS_UNCOPYABLE(Thread) 15 聽public : 16 聽聽聽聽聽Thread() 17 聽聽聽聽聽聽聽聽聽:_target( 0 ) 18 聽聽聽聽聽聽聽聽聽,_handle( 0 )聽{ 19 聽20 聽聽聽聽聽} 21 聽聽聽聽聽template聽 < class 聽T > 22 聽聽聽聽聽explicit聽Thread( const 聽T & op) 23 聽聽聽聽聽聽聽聽聽:_target(transfer(op)) 24 聽聽聽聽聽聽聽聽聽,_handle( 0 )聽{ 25 聽26 聽聽聽聽聽} 27 聽聽聽聽聽virtual聽 ~ Thread(); 28 聽聽聽聽聽virtual聽 void 聽run()聽{} 29 聽聽聽聽聽 void 聽start(); 30 聽聽聽聽聽 void 聽join(); 31 聽private : 32 聽聽聽聽聽 static 聽unsigned聽__stdcall聽threadProc( void * param); 33 聽private : 34 聽聽聽聽聽Runnable * _target; 35 聽聽聽聽聽HANDLE聽_handle; 36 聽}; 37 聽38 聽#endif /* THREAD_H */
thread.cpp鍜屽墠涓綃囩殑鍑犱箮涓鏍鳳紝鍞竴鐨勪笉鍚屾槸鍘繪帀浜嗘瀯閫犲嚱鏁癟hread(Runnable *)錛屽洜涓虹幇鍦ㄧ殑鏋勯犲嚱鏁版敼鎴愪簡鎴愬憳妯℃澘錛屽疄鐜頒篃鏀懼湪thread.h涓簡銆傜幇鍦ㄧ殑鏋勯犲嚱鏁拌兘澶熸帴鍙楀悇縐嶇被鍨嬬殑鍙傛暟錛屼富瑕佸綊鍔熶簬妯℃澘鍑芥暟transfer錛屽疄鐜頒唬鐮佸湪runnable.h涓紝涓昏鎶宸ф槸鐢ㄧ被鐨勫亸鐗瑰寲妯℃嫙鍑芥暟妯℃澘鐨勫亸鐗瑰寲錛屼笉鏄庣櫧鐨勮鐪?a id="_117bf2a46b69_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl01_TitleUrl" href="/ant/archive/2007/08/30/31201.html">涓轟粈涔堜笉瑕佺壒鍖栧嚱鏁版ā鐗?/a>銆?br /> 涓嬮潰鏄祴璇曚唬鐮侊細test.cpp 聽1 聽#include聽 " thread.h " 聽2 聽#include聽 < iostream > 聽3 聽#include聽 < functional > 聽4 聽聽5 聽using聽namespace聽std; 聽6 聽聽7 聽// no聽argument聽function 聽8 聽void 聽print()聽{ 聽9 聽聽聽聽聽cout聽 << 聽 " print " 聽 << 聽endl; 10 聽} 11 聽12 聽// unary聽function 13 聽void 聽print1( int 聽n)聽{ 14 聽聽聽聽聽cout聽 << 聽 " print1 " 聽 << 聽endl; 15 聽} 16 聽17 聽// binary聽function 18 聽void 聽print2( int 聽m,聽 int 聽n)聽{ 19 聽聽聽聽聽cout聽 << 聽 " print2 " 聽 << 聽endl; 20 聽} 21 聽22 聽23 聽// no聽argument聽functor 24 聽struct聽PrintFunctor聽{ 25 聽聽聽聽聽 void 聽operator()()聽 const 聽{ 26 聽聽聽聽聽聽聽聽聽cout聽 << 聽 " PrintFunctor " 聽 << 聽endl; 27 聽聽聽聽聽} 28 聽}; 29 聽30 聽// unary聽functor 31 聽struct聽PrintFunctor1聽:聽 public 聽unary_function < int ,聽 void > 聽{ 32 聽聽聽聽聽 void 聽operator()( int 聽n)聽 const 聽{ 33 聽聽聽聽聽聽聽聽聽cout聽 << 聽 " PrintFunctor1 " 聽 << 聽endl; 34 聽聽聽聽聽} 35 聽}; 36 聽37 聽// binary聽functor 38 聽struct聽PrintFunctor2聽:聽 public 聽binary_function < int ,聽 int ,聽 void > 聽{ 39 聽聽聽聽聽 void 聽operator()( int 聽m,聽 int 聽n)聽 const 聽{ 40 聽聽聽聽聽聽聽聽聽cout聽 << 聽 " PrintFunctor2 " 聽 << 聽endl; 41 聽聽聽聽聽} 42 聽}; 43 聽44 聽int 聽main()聽{ 45 聽46 聽聽聽聽聽 // construct聽Thread聽with聽no聽argument聽function 47 聽聽聽聽聽Thread聽thread1( & print); 48 聽聽聽聽聽thread1.start(); 49 聽50 聽聽聽聽聽 // construct聽Thread聽with聽unary聽function 51 聽聽聽聽聽Thread聽thread2(bind(ptr_fun(print1),聽 5 )); 52 聽聽聽聽聽thread2.start(); 53 聽54 聽聽聽聽聽 // construct聽Thread聽with聽binary聽function 55 聽聽聽聽聽Thread聽thread3(bind(bind1st(ptr_fun(print2),聽 1 ),聽 2 )); 56 聽聽聽聽聽thread3.start(); 57 聽58 聽59 聽聽聽聽聽 // construct聽Thread聽with聽no聽argument聽functor 60 聽聽聽聽聽Thread聽thread4((PrintFunctor())); 61 聽聽聽聽聽thread4.start(); 62 聽63 聽聽聽聽聽 // construct聽Thread聽with聽unary聽functor 64 聽聽聽聽聽Thread聽thread5(bind(PrintFunctor1(),聽 5 )); 65 聽聽聽聽聽thread5.start(); 66 聽67 聽聽聽聽聽 // construct聽Thread聽with聽binary聽functor 68 聽聽聽聽聽Thread聽thread6(bind(bind1st(PrintFunctor2(),聽 1 ),聽 2 )); 69 聽聽聽聽聽thread6.start(); 70 聽71 聽聽聽聽聽thread1.join(); 72 聽聽聽聽聽thread2.join(); 73 聽聽聽聽聽thread3.join(); 74 聽聽聽聽聽thread4.join(); 75 聽聽聽聽聽thread5.join(); 76 聽聽聽聽聽thread6.join(); 77 聽78 聽聽聽聽聽 return 聽 0 ; 79 聽}
褰撶劧浜嗭紝涓婇潰鐨勫茍涓嶆槸鍏ㄩ儴錛屼慨鏀瑰悗鐨凾hread綾諱笉浠呰兘澶熶嬌鐢ㄥ師鍏堢殑浠嶵hread綾葷戶鎵挎垨鑰呭疄鐜癛unnable鎺ュ彛鐨勬柟娉曪紝榪樺彲浠ヤ嬌鐢ㄤ換浣曟棤鍙傚嚱鏁版垨鏃犲弬鍑芥暟瀵硅薄銆傞櫎浜唗est.cpp閲岀ず鑼冪殑錛屼綘鐢氳嚦鍙互鐢╞ind,bind1st,bind2st,mem_fun,mem_fun_ref鐨勭粍鍚堟潵鐢ㄦ煇涓被鐨勬垚鍛樺嚱鏁頒綔涓哄弬鏁幫紝鍏鋒湁瓚呭己鐨勭伒媧繪с?br /> 鐩墠瀹炵幇鐨勮繖浜涢兘鏄疶hread綾繪渶鍩烘湰鐨勫姛鑳斤紝鍏朵粬鍔熻兘濡傝緗嚎紼嬩紭鍏堢駭錛屾寕璧鋒垨鎭㈠綰跨▼錛屽紓甯稿鐞嗙瓑鍏蜂綋瀹炵幇閮芥瘮杈冪畝鍗曪紝榪欒繖閲屽氨涓嶄竴涓瀹炵幇浜嗐? 婧愪唬鐮佷笅杞斤細鐐瑰嚮涓嬭澆 ]]> C++&Win32鍐欑殑絀哄綋鎺ラ緳 http://www.shnenglu.com/ant/archive/2007/08/30/31234.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Thu, 30 Aug 2007 13:37:00 GMT http://www.shnenglu.com/ant/archive/2007/08/30/31234.html http://www.shnenglu.com/ant/comments/31234.html http://www.shnenglu.com/ant/archive/2007/08/30/31234.html#Feedback 18 http://www.shnenglu.com/ant/comments/commentRss/31234.html http://www.shnenglu.com/ant/services/trackbacks/31234.html 絀哄綋鎺ラ緳 娓告垙錛屽啓浜嗕竴涓ぜ鎷滐紝瀹屽叏浠縲indows鐨勫懙鍛點?br>涓嶈繃涔熶笉鍏ㄤ竴鏍鳳紝鏈変竴浜涚粏鑺備竴鐩存病鏈夋椂闂村紕錛屾病鍔炴硶鏈榪戞瘮杈冩噿... 涓巜indows涓嬬殑鐩告瘮錛屾垜鍋氱殑榪欎釜鍔犲叆浜?span style="COLOR: #993300">AI (蹇嵎閿瓼6)錛屽彲浠ュ紑鍚?span style="COLOR: #993300">縐葷墝鎻愮ず (蹇嵎閿瓼7)錛屼笉榪?span style="COLOR: #993300">鎾ら攢 涓鐩存病鏈夊仛錛屽彲鑳藉摢澶╃獊鐒舵兂鍋氫簡浼氬姞涓婂幓銆傚彟澶栨敼榪涗簡搴熺墝鍥炴敹綆楁硶 錛岄潪娉曠Щ鐗岀殑鎻愮ず鐩存帴鍘繪帀浜嗭紝榪樻湁涓浜涘皬鐨勭粏鑺備綔浜嗘敼榪涖?br>鎰熷叴瓚g殑鍙互涓嬭澆錛?a title=鐐瑰嚮涓嬭澆 href="http://www.shnenglu.com/Files/ant/Freecell.rar">鐐瑰嚮涓嬭澆 婧愪唬鐮佷笅杞斤細鐐瑰嚮涓嬭澆 欏轟究鍙戝嚑寮犳埅鍥撅細
]]> 涓轟粈涔堜笉瑕佺壒鍖栧嚱鏁版ā鐗?/title> http://www.shnenglu.com/ant/archive/2007/08/30/31201.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Thu, 30 Aug 2007 05:55:00 GMT http://www.shnenglu.com/ant/archive/2007/08/30/31201.html http://www.shnenglu.com/ant/comments/31201.html http://www.shnenglu.com/ant/archive/2007/08/30/31201.html#Feedback 4 http://www.shnenglu.com/ant/comments/commentRss/31201.html http://www.shnenglu.com/ant/services/trackbacks/31201.html
Overloading vs. Specialization
鍦–++涓湁class templates 鍜?em>function templates錛岃繖涓ょ妯$増鏈夊緢澶氬尯鍒紝鏈閲嶈鐨勫尯鍒氨鏄噸杞?overloading)錛?br />鏅氱殑C++綾諱笉鑳介噸杞斤紝褰撶劧綾繪ā鐗堜篃涓嶈兘閲嶈澆錛涚浉鍙嶏紝鏅氬嚱鏁板彲浠ラ噸杞斤紝鍑芥暟妯$増涔熻兘閲嶈澆銆傝繖鍐嶆甯鎬笉榪囷紝鐪嬩笅闈㈢殑浠g爜錛?/p>
聽1 聽//
聽Example聽1:聽Class聽vs.聽function聽template,聽and聽overloading聽
聽2 聽//
聽3 聽
聽4 聽// 聽A聽class聽template
聽5 聽template < class 聽T > 聽 class 聽X聽{聽 /*... */ 聽};聽聽聽聽聽聽 //
聽(a)
聽6 聽
聽7 聽// 聽A聽function聽template聽with聽two聽overloads
聽8 聽template < class 聽T > 聽 void 聽f(聽T聽);聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 聽(b)
聽9 聽template < class 聽T > 聽 void 聽f(聽 int ,聽T,聽 double 聽);聽 //
聽(c)
10 聽
鍍忎笂闈㈡湭鐗瑰寲鐨勬ā鏉塊氬父鍙仛base templates 銆傚綋鐒訛紝base templates 鑳藉琚壒鍖栵紝鍦ㄧ壒鍖栬繖涓鐐逛笂class templates 鍜?em>function templates鏈夊緢澶х殑鍖哄埆錛氫竴涓?em>class template 鑳藉琚?em>partially specialized and/or fully specialized 錛屼竴涓?em>function template鍙兘琚?em>fully specialized錛屼絾鏄敱浜?em>function templates鑳藉閲嶈澆鎴戜滑鍙互閫氳繃閲嶈澆鏉ュ疄鐜板拰partially specialized 鐩稿綋鐨勫姛鑳姐備笅闈㈢殑浠g爜璇存槑浜嗚繖浜涘尯鍒細
聽1 聽//
聽Example聽1,聽continued:聽Specializing聽templates聽
聽2 聽//
聽3 聽
聽4 聽// 聽A聽partial聽specialization聽of聽(a)聽for聽pointer聽types聽
聽5 聽template < class 聽T > 聽 class 聽X < T *> 聽{聽 /*... */
聽};
聽6 聽
聽7 聽// 聽A聽full聽specialization聽of聽(a)聽for聽int聽
聽8 聽template <> 聽 class 聽X < int > 聽{聽 /*... */
聽};
聽9 聽
10 聽//
聽A聽separate聽base聽template聽that聽overloads聽(b)聽and聽(c)聽
11 聽//
聽--聽NOT聽a聽partial聽specialization聽of聽(b),聽because聽
12 聽//
聽there's聽no聽such聽thing聽as聽a聽partial聽specialization聽
13 聽// 聽of聽a聽function聽template!聽
14 聽template < class 聽T > 聽 void 聽f(聽T * 聽);聽聽聽聽聽聽聽聽聽聽聽聽聽 //
聽(d)
15 聽
16 聽// 聽A聽full聽specialization聽of聽(b)聽for聽int聽
17 聽template <> 聽 void 聽f < int > (聽 int 聽);聽聽聽聽聽聽聽聽聽聽聽聽聽聽 //
聽(e)
18 聽
19 聽//
聽A聽plain聽old聽function聽that聽happens聽to聽overload聽with聽
20 聽//
聽(b),聽(c),聽and聽(d)聽--聽but聽not聽(e),聽which聽we'll聽
21 聽// 聽discuss聽in聽a聽moment聽
22 聽void 聽f(聽 double 聽);聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 //
聽(f)
23 聽
鏍規嵁鍑芥暟閲嶈澆瑙f瀽瑙勫垯錛?/p>
聽1 聽//
聽Example聽1,聽continued:聽Overload聽resolution聽
聽2 聽// 聽
聽3 聽
bool聽b;聽
聽4 聽int
聽i;聽
聽5 聽double
聽d;
聽6 聽
聽7 聽f(聽b聽);聽聽聽聽聽聽聽聽 // 聽calls聽(b)聽with聽T聽=聽bool聽
聽8 聽f(聽i,聽 42 ,聽d聽);聽 // 聽calls聽(c)聽with聽T聽=聽int聽
聽9 聽f(聽 & i聽);聽聽聽聽聽聽聽 // 聽calls聽(d)聽with聽T聽=聽int聽
10 聽f(聽i聽);聽聽聽聽聽聽聽聽 // 聽calls聽(e)聽
11 聽f(聽d聽);聽聽聽聽聽聽聽聽 // 聽calls聽(f)
涓婇潰璇寸殑榪欎簺鍏跺疄閮芥槸寰堢畝鍗曠殑鎯呭喌錛屽ぇ澶氭暟浜哄緢瀹規槗灝辮兘鏄庣櫧錛屼笅闈㈢殑鎵嶆槸瀹規槗璁╀漢寮勬販鐨勶細 1.鑰冭檻濡備笅浠g爜錛?/p>
聽1 聽//
聽Example聽2:聽Explicit聽specialization聽
聽2 聽// 聽
聽3 聽template < class 聽T > 聽 // 聽(a)聽a聽base聽template聽
聽4 聽void
聽f(聽T聽);
聽5 聽
聽6 聽template < class 聽T > 聽 // 聽(b)聽a聽second聽base聽template,聽overloads聽(a)聽
聽7 聽void 聽f(聽T * 聽);聽聽聽聽聽 //
聽聽聽聽聽(function聽templates聽can't聽be聽partially聽
聽8 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 聽聽聽聽聽specialized;聽they聽overload聽instead)
聽9 聽
10 聽template <> 聽聽聽聽聽聽聽聽 // 聽(c)聽explicit聽specialization聽of聽(b)聽
11 聽void 聽f <> ( int *
);
12 聽
13 聽// 聽...
14 聽
15 聽int 聽 *
p;聽
16 聽f(聽p聽);聽聽聽聽聽聽聽聽聽聽聽 // 聽calls聽(c)
鏈鍚庝竴琛岀殑緇撴灉鍍忓ぇ澶氭暟浜烘墍鏈熸湜鐨勪竴鏍鳳紝闂鏄細涓轟粈涔堟湡鏈涙槸榪欎釜緇撴灉錛?br />濡傛灉浣犳湡鏈涚殑鍘熷洜鏄敊璇殑錛屾帴涓嬫潵鐨勪竴瀹氫細璁╀綘濂藉銆備篃璁鎬綘浼氳錛?鎴戜負int* 鍐欎簡涓涓壒鍖栫増鏈紝f(p) 褰撶劧浼氳皟鐢?span style="COLOR: #3366ff">c"錛屼笉騫哥殑鏄紝榪欐鏄敊璇殑鍘熷洜!!! 2.鍐嶈冭檻涓嬮潰鐨勪唬鐮侊細
聽1 聽//
聽Example聽3
聽2 聽// 聽
聽3 聽template < class 聽T > 聽 // 聽(a)聽same聽old聽base聽template聽as聽before聽
聽4 聽void
聽f(聽T聽);
聽5 聽
聽6 聽template <> 聽聽聽聽聽聽聽聽 // 聽(c)聽explicit聽specialization,聽this聽time聽of聽(a)
聽7 聽void 聽f <> ( int *
);
聽8 聽
聽9 聽template < class 聽T > 聽 // 聽(b)聽a聽second聽base聽template,聽overloads聽(a)聽
10 聽void 聽f(聽T *
聽);
11 聽
12 聽// 聽...
13 聽
14 聽int 聽 *
p;聽
15 聽f(聽p聽);聽聽聽聽聽聽聽聽聽聽聽 //
聽calls聽(b)!聽overload聽resolution聽ignores聽
16 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 //
聽specializations聽and聽operates聽on聽the聽base聽
17 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 聽function聽templates聽only
濡傛灉榪欎釜緇撴灉璁╀綘鎰熷埌鎯婂錛岄偅灝卞浜嗭紒寰堝浜洪兘浼氭劅鍒版儕濂囷紒 鐞嗚В榪欎釜鐨勫叧閿槸錛?em style="COLOR: #993300">Specializations don't overload,only the base templates overload. 閲嶈澆瑙f瀽浠呬粎閫夋嫨base template(鎴栬卬ontemplate function錛屽鏋滄湁鐨勮瘽)錛屽彧鏈夊綋緙栬瘧鍣ㄥ凡緇忓喅瀹氫簡鍝釜 base template灝嗕細琚夋嫨錛岀紪璇戝櫒鎵嶄細緇х畫寰涓嬪鎵鵑傚悎鐨勭壒鍖栫増鏈紝濡傛灉鎵懼埌浜嗗氨浣跨敤閭d釜鐗瑰寲鐗堟湰銆?br /> 鏈鍚庯紝搴斿綋閬垮厤鐗瑰寲鍑芥暟妯℃澘錛屼篃瑕侀伩鍏嶉噸杞藉嚱鏁版ā鏉?nontemplate function鐨勯噸杞藉綋鐒舵病闂)銆傚鏋滀竴瀹氳榪欐牱錛屽彲浠ヤ嬌鐢ㄥ涓嬫柟娉曟ā鎷熷嚱鏁版ā鏉跨殑鍋忕壒鍖栵細
聽1 聽// base聽template聽class,聽
聽2 聽template聽 < class 聽T >
聽3 聽
struct聽FuncImpl聽{
聽4 聽聽聽聽聽 // users,聽go聽ahead聽and聽specialize聽this
聽5 聽聽聽聽聽 static 聽 int 聽apply( const 聽T聽 &
t)聽{
聽6 聽聽聽聽聽聽聽聽聽 return 聽 0
;
聽7 聽
聽聽聽聽}
聽8 聽
};
聽9 聽
10 聽// partial聽specialazation聽for聽int
11 聽template聽 <>
12 聽struct聽FuncImpl < int >
聽{
13 聽聽聽聽聽 static 聽 int 聽apply( int
聽t)聽{
14 聽聽聽聽聽聽聽聽聽 return 聽 1
;
15 聽
聽聽聽聽}
16 聽
};
17 聽
18 聽// partial聽specialazation聽for聽T*
19 聽template聽 < class 聽T >
20 聽聽聽聽聽struct聽FuncImpl < T聽 *>
聽{
21 聽聽聽聽聽 static 聽 int 聽apply(T聽 *
t)聽{
22 聽聽聽聽聽聽聽聽聽 return 聽 2
;
23 聽
聽聽聽聽}
24 聽
};
25 聽
26 聽// users,聽don't聽touch聽this!
27 聽template聽 < class 聽T >
28 聽int 聽func( const 聽T聽 &
t)聽{
29 聽聽聽聽聽 return 聽FuncImpl < T >
::apply(t);
30 聽
}
31 聽
32 聽int 聽i聽 = 聽 10
,聽r;
33 聽r聽 = 聽func( ' c ' );聽 // r聽=聽0
34 聽r聽 = 聽func( 8 );聽 // r聽=聽1
35 聽r聽 = 聽func( & i);聽 // r聽=聽2
]]> 浠嶹in32 API灝佽Thread綾籟1] http://www.shnenglu.com/ant/archive/2007/08/30/31190.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Thu, 30 Aug 2007 02:18:00 GMT http://www.shnenglu.com/ant/archive/2007/08/30/31190.html http://www.shnenglu.com/ant/comments/31190.html http://www.shnenglu.com/ant/archive/2007/08/30/31190.html#Feedback 7 http://www.shnenglu.com/ant/comments/commentRss/31190.html http://www.shnenglu.com/ant/services/trackbacks/31190.html 鍓嶅嚑澶╁湪瀛indows澶氱嚎紼嬬▼搴忚璁★紝鍙戠幇Win32 API鐢ㄨ搗鏉ョ‘瀹炰笉鎬庝箞鏂逛究錛岀壒鍒槸瀵逛簬C++紼嬪簭鍛樸備簬鏄疄鐜頒簡涓涓畝鍗曠殑灝佽錛屾妧鏈惈閲忓綋鐒朵笉楂橈紝涓嶈繃鐢ㄨ搗鏉ヨ繕鏄瘮杈冩柟渚跨殑銆傚鏋滀綘鐔熸倝Java錛屼綘浼氬彂鐜拌繖涓疄鐜版湁鐐瑰儚Java鐨凾hread錛屽湪Java涓湁涓ょ鏂規硶鍙互鍒涘緩涓涓猅hread錛?br /> 1.浠嶵hread綾葷戶鎵垮茍瀹炵幇run鏂規硶錛?/p>
1 聽class 聽MyThread聽 extends
聽Thread聽{
2 聽聽聽聽聽 public 聽 void
聽run()聽{
3 聽
聽聽聽聽聽聽聽聽...
4 聽
聽聽聽聽}聽
5 聽
};
6 聽
7 聽// 寮鍚嚎紼?/span>
8 聽MyThread聽thread聽 = 聽 new
聽MyThread;
9 聽thread.start();
2.澹版槑涓涓被瀹炵幇Runnable鎺ュ彛騫跺疄鐜皉un鏂規硶錛?/p>
1 聽class 聽MyRunnable聽 implements
聽Runnable聽{
2 聽聽聽聽聽 public 聽 void
聽run()聽{
3 聽
聽聽聽聽聽聽聽聽...
4 聽
聽聽聽聽}
5 聽
};
6 聽
7 聽// 聽寮鍚嚎紼嬄?/span>
8 聽MyThread聽thread聽 = 聽 new 聽MyThread( new
聽MyRunnable);
9 聽thread.start();
鍏蜂綋瀹炵幇
Java鐨勫疄鐜版柟寮忚繕綆椾紭闆咃紝鎴戜滑涔熷彲浠ュ湪C++涓ā鎷燂紝鐢變簬綃囧箙鎵闄愶紝鍦ㄨ繖閲屾垜浠彧鍏蟲敞鍩烘湰鍔熻兘鐨勫疄鐜幫細thread.h 聽1 聽#ifndef聽THREAD_H 聽2 聽#define聽THREAD_H 聽3 聽聽4 聽#include聽 < windows.h > 聽5 聽聽6 聽#define聽CLASS_UNCOPYABLE(classname)聽\ 聽7 聽聽聽聽聽 private :聽\ 聽8 聽聽聽聽聽classname( const 聽classname & );聽\ 聽9 聽聽聽聽聽classname & 聽operator = ( const 聽classname & ); 10 聽11 聽struct聽Runnable聽{ 12 聽聽聽聽聽virtual聽 void 聽run()聽 = 聽 0 ; 13 聽聽聽聽聽virtual聽 ~ Runnable()聽{} 14 聽}; 15 聽16 聽class 聽Thread聽:聽 public 聽Runnable聽{ 17 聽聽聽聽聽CLASS_UNCOPYABLE(Thread) 18 聽public : 19 聽聽聽聽聽explicit聽Thread(Runnable * target聽 = 聽 0 ); 20 聽聽聽聽聽virtual聽 ~ Thread(); 21 聽聽聽聽聽virtual聽 void 聽run()聽{} 22 聽聽聽聽聽 void 聽start(); 23 聽聽聽聽聽 void 聽join(); 24 聽private : 25 聽聽聽聽聽 static 聽unsigned聽__stdcall聽threadProc( void * param); 26 聽private : 27 聽聽聽聽聽Runnable * _target; 28 聽聽聽聽聽HANDLE聽_handle; 29 聽}; 30 聽31 聽#endif /* THREAD_H */
鍦ㄤ笂闈㈢殑浠g爜涓垜浠厛瀹氫箟涓涓猂unnable綾伙紝騫朵負Runnable綾繪坊鍔犵函铏氬嚱鏁皉un錛岄渶瑕佺壒鍒敞鎰忕殑鏄疪unnable綾葷殑铏氭瀽鏋勫嚱鏁幫紝浠諱綍鎯寵鎴愪負鍩虹被鐨刢lass閮藉簲璇ュ0鏄庢瀽鏋勫嚱鏁頒負virtual銆?br />Thread綾葷洿鎺ョ戶鎵胯嚜Runnable錛孋LASS_UNCOPYABLE(Thread) 榪欎竴琛岀敤瀹忓0鏄嶵hread綾諱笉鍙嫹璐濓紝鍏蜂綋緇嗚妭璇風湅 鑰冭檻鐢∕acro鏇挎崲Uncopyable 銆俿tart鎴愬憳鍑芥暟鍜孞ava涓殑涓鏍鳳紝鐢ㄦ潵寮鍚竴涓嚎紼嬶紝join鎴愬憳鍑芥暟鐢ㄦ潵闃誨褰撳墠綰跨▼鐩村埌寮鍚殑綰跨▼鎵ц瀹屾瘯銆倀hreadProc浣滀負闈欐佹垚鍛樺嚱鏁扮敤鏉ヤ紶閫掔粰_beginthreadex錛岃嚦浜庝負浠涔堢敤_beginthreadex浠f浛CreateThread璇烽棶Google銆傚垵姝ョ殑瀹炵幇閮芥瘮杈冪畝鍗曪紝鐩存帴璐翠笂浠g爜錛?br />thread.cpp 聽1 聽#include聽 " thread.h " 聽2 聽#include聽 < process.h > 聽 // for聽_beginthreadex 聽3 聽聽4 聽Thread::Thread(Runnable * target聽 /* =聽0 */ ) 聽5 聽:_target( target ) 聽6 聽,_handle( 0 )聽{ 聽7 聽聽8 聽} 聽9 聽10 聽Thread:: ~ Thread()聽{ 11 聽聽聽聽聽 if 聽(_handle聽 != 聽 0 ) 12 聽聽聽聽聽聽聽聽聽CloseHandle(_handle); 13 聽聽聽聽聽 if 聽(_target聽 != 聽 0 ) 14 聽聽聽聽聽聽聽聽聽delete聽_target; 15 聽} 16 聽17 聽void 聽Thread::start()聽{ 18 聽聽聽聽聽 if 聽(_handle聽 != 聽 0 ) 19 聽聽聽聽聽聽聽聽聽 return ; 20 聽聽聽聽聽unsigned聽id; 21 聽聽聽聽聽_handle聽 = 聽reinterpret_cast < HANDLE > ( 22 聽聽聽聽聽聽聽聽聽_beginthreadex( 0 ,聽 0 ,聽threadProc,聽 this ,聽 0 ,聽 & id) 23 聽聽聽聽聽聽聽聽聽); 24 聽} 25 聽26 聽void 聽Thread::join()聽{ 27 聽聽聽聽聽 if (_handle聽 != 聽 0 )聽{ 28 聽聽聽聽聽聽聽聽聽WaitForSingleObject(_handle,聽INFINITE); 29 聽聽聽聽聽聽聽聽聽CloseHandle(_handle); 30 聽聽聽聽聽聽聽聽聽_handle聽 = 聽 0 ; 31 聽聽聽聽聽} 32 聽} 33 聽34 聽unsigned聽__stdcall聽Thread::threadProc( void * param)聽{ 35 聽聽聽聽聽Thread * p聽 = 聽static_cast < Thread *> (param); 36 聽聽聽聽聽 if 聽(p -> _target聽 != 聽 0 ) 37 聽聽聽聽聽聽聽聽聽p -> _target -> run(); 38 聽聽聽聽聽 else 39 聽聽聽聽聽聽聽聽聽p -> run(); 40 聽聽聽聽聽 return 聽 0 ; 41 聽}
涓嬮潰鏄祴璇曚唬鐮侊細test.cpp 聽1 聽#include聽 " thread.h " 聽2 聽#include聽 < iostream > 聽3 聽聽4 聽using聽namespace聽std; 聽5 聽聽6 聽// 絎竴縐嶆柟娉曪紝浠嶵hread綾葷戶鎵?/span> 聽7 聽struct聽MyThread聽:聽 public 聽Thread聽{ 聽8 聽聽聽聽聽virtual聽 void 聽run()聽{ 聽9 聽聽聽聽聽聽聽聽聽 for 聽( int 聽i聽 = 聽 0 ;聽i聽 < 聽 5 ;聽 ++ i)聽{ 10 聽聽聽聽聽聽聽聽聽聽聽聽聽cout聽 << 聽 " MyThread聽Running... " 聽 << 聽i聽 << 聽endl; 11 聽聽聽聽聽聽聽聽聽聽聽聽聽Sleep( 100 ); 12 聽聽聽聽聽聽聽聽聽} 13 聽聽聽聽聽} 14 聽}; 15 聽16 聽// 絎簩縐嶆柟娉曪紝鈥滃疄鐜扳漅unnable鎺ュ彛 17 聽struct聽MyRunnable聽:聽 public 聽Runnable聽{ 18 聽聽聽聽聽virtual聽 void 聽run()聽{ 19 聽聽聽聽聽聽聽聽聽 for 聽( int 聽i聽 = 聽 0 ;聽i聽 < 聽 5 ;聽 ++ i)聽{ 20 聽聽聽聽聽聽聽聽聽聽聽聽聽cout聽 << 聽 " MyRunnable聽Running... " 聽 << 聽i聽 << 聽endl; 21 聽聽聽聽聽聽聽聽聽聽聽聽聽Sleep( 300 ); 22 聽聽聽聽聽聽聽聽聽} 23 聽聽聽聽聽} 24 聽}; 25 聽26 聽int 聽main()聽{ 27 聽28 聽聽聽聽聽MyThread聽thread1; 29 聽聽聽聽聽Thread聽thread2( new 聽MyRunnable()); 30 聽聽聽聽聽thread1.start(); 31 聽聽聽聽聽thread2.start(); 32 聽聽聽聽聽thread1.join(); 33 聽聽聽聽聽thread2.join(); 34 聽35 聽聽聽聽聽 return 聽 0 ; 36 聽}
鍙兘鐨勮繍琛岀粨鏋滐細MyThread Running...0 MyRunnable Running...0 MyThread Running...1 MyThread Running...2 MyRunnable Running...1 MyThread Running...3 MyThread Running...4 MyRunnable Running...2 MyRunnable Running...3 MyRunnable Running...4 濡傛灉浣犵啛鎮塨oost搴擄紝浣犱細鐭ラ亾boost搴撶殑Thread鏋勯犲嚱鏁板彲浠ユ帴鍙楁櫘閫氬嚱鏁板拰鍑芥暟瀵硅薄浣滀負鍙傛暟錛屽鏋滀綘瑙夊緱浠嶵hread綾葷戶鎵挎垨鑰呭疄鐜癛unnable鎺ュ彛榪樹笉澶熺畝媧侊紝涓嬩竴綃囦細鏈変竴涓瘮杈冨ソ鐨勬敼榪涖? ]]> 鑰冭檻鐢∕acro鏇挎崲Uncopyable http://www.shnenglu.com/ant/archive/2007/08/27/30908.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Mon, 27 Aug 2007 00:11:00 GMT http://www.shnenglu.com/ant/archive/2007/08/27/30908.html http://www.shnenglu.com/ant/comments/30908.html http://www.shnenglu.com/ant/archive/2007/08/27/30908.html#Feedback 2 http://www.shnenglu.com/ant/comments/commentRss/30908.html http://www.shnenglu.com/ant/services/trackbacks/30908.html 1. 灝嗚繖涓被鐨刢opy鏋勯犲嚱鏁板拰copy assignment鎿嶄綔絎﹂兘澹版槑涓簆rivate鑰屼笖娌℃湁瀹氫箟銆傜ず渚嬩唬鐮佸涓嬶細1 聽class 聽SomeClass聽{ 2 聽聽聽聽聽... 3 聽private : 4 聽聽聽聽聽 // 鍙湁澹版槑 5 聽聽聽聽聽SomeClass( const 聽SomeClass & ); 6 聽聽聽聽聽SomeClass & 聽operator = ( const 聽SomeClass & ); 7 聽};
2. 涓撻棬璁捐涓涓負浜嗛樆姝opying鍔ㄤ綔鑰岃璁$殑base class錛岃繖涓猙ase class鐩稿綋綆鍗曪細1 聽Uncopyable聽{ 2 聽protected :聽 // 鍏佽derived瀵硅薄鏋勯犲拰鏋愭瀯 3 聽聽聽聽聽Uncopyable()聽{} 4 聽聽聽聽聽 ~ Uncopyable()聽{} 5 聽private :聽 // 闃繪copying 6 聽聽聽聽聽Uncopyable( const 聽Uncopyable & ); 7 聽聽聽聽聽Uncopyable & 聽operator = ( const 聽Uncopyable & ); 8 聽};
涓轟簡闃繪鏌愪釜瀵硅薄濡係omeClass琚玞opying錛屾垜浠敮涓闇瑕佸仛鐨勫氨鏄戶鎵胯嚜Uncopyable錛?br />1 聽SomeClass聽:聽 private 聽Uncopyable聽{ 2 聽聽聽聽聽... 3 聽};
絎?縐嶆柟妗堣矊浼煎緢瀹岀編錛屽湪澶у鏁版儏鍐典笅涔熷伐浣滅殑寰堝ソ錛岀敋鑷砨oost搴撲篃騫挎硾閲囩敤浜?boost搴撲腑鐨勫彨noncopyable)銆傚綋鐒朵簡錛屽洜涓篣ncopyable涓嶅惈浠諱綍鏁版嵁錛岀鍚圗BO(empty base class optimization錛岀┖鐧藉熀綾繪渶浼樺寲)璧勬牸錛屼絾鐢變簬瀹冩繪槸鎵紨base class錛屽洜姝ゆ湁鍙兘瀵艱嚧澶氶噸緇ф壙錛岃孍BO涓鑸彧鍦ㄥ崟緇ф壙涓嬫墠鍙錛岀紪璇戝櫒閫氬父涓嶄細瀵規湁澶氫釜base class鐨刣erived classes鏂借EBO銆?br /> 濡傛灉浣犱笉鎯沖鑷村閲嶇戶鎵匡紝涓嶇鏄粠鎬ц兘涓婅繕鏄功鍐欎唬鐮佷笂錛屾瘮濡係omeClass緇ф壙鑷煇涓猙ase class錛屼綘鍙兘浼氬啓濡備笅浠g爜錛?br />1 聽class 聽SomeClass聽:聽 public 聽BaseClass,聽 private 聽Uncopyable聽{ 2 聽聽聽聽聽... 3 聽};
榪欒浜哄緢涓嶇埥錛岃鏄綘璺熸垜涓鏍鋒噿錛屼綘鑲畾涔熶笉浼氭効鎰忛噰鐢ㄧ涓縐嶆柟妗堬紝鍥犱負閭f剰鍛崇潃浣犱細鍦ㄦ瘡涓涓笉鎯寵copying鐨刢lass閲岄兘鍔犱笂閭d笁琛屼唬鐮併?br /> 濡傛灉鐢∕acro灝卞緢綆鍗曚簡錛屽嵆鐏墊椿鍙堟柟渚匡細 1 聽#define聽CLASS_UNCOPYABLE(classname)聽\ 2 聽聽聽聽聽 private :聽\ 3 聽聽聽聽聽classname( const 聽classname & );聽\ 4 聽聽聽聽聽classname & 聽operator = ( const 聽classname & );
鐜板湪SomeClass鍙渶鍐欐垚榪欐牱錛?br />1 聽class 聽SomeClass聽{ 2 聽聽聽聽聽CLASS_UNCOPYABLE(SomeClass) 3 聽聽聽聽聽... 4 聽};
涓嶄粎鐪佷簨鑰屼笖鐏墊椿錛侊紒錛?img src ="http://www.shnenglu.com/ant/aggbug/30908.html" width = "1" height = "1" /> ]]>
AV无码久久久久不卡网站下载 |
久久久久久午夜成人影院 |
99久久99久久精品国产片 |
大美女久久久久久j久久 |
久久午夜福利电影 |
久久精品蜜芽亚洲国产AV |
久久综合狠狠综合久久激情 |
久久精品国产国产精品四凭 |
久久亚洲AV成人无码软件 |
精品国产91久久久久久久 |
综合久久给合久久狠狠狠97色
|
久久久久久久99精品免费观看 |
亚洲国产天堂久久综合网站 |
亚洲AV伊人久久青青草原 |
av无码久久久久不卡免费网站 |
欧洲国产伦久久久久久久 |
久久99精品综合国产首页 |
久久精品中文字幕大胸 |
国产精品热久久毛片 |
97精品久久天干天天天按摩 |
伊人久久无码精品中文字幕 |
成人精品一区二区久久久 |
97精品国产91久久久久久 |
亚洲欧美伊人久久综合一区二区 |
久久国产免费 |
久久久久久一区国产精品 |
国产成人久久精品二区三区 |
久久综合给合久久狠狠狠97色 |
久久无码AV一区二区三区 |
久久国产三级无码一区二区 |
久久综合久久综合久久 |
久久91精品国产91久久户 |
久久精品国产网红主播 |
久久久久久国产精品免费无码 |
久久久这里只有精品加勒比 |
久久最新免费视频 |
伊人色综合九久久天天蜜桃 |
婷婷国产天堂久久综合五月 |
亚洲天堂久久久 |
97精品依人久久久大香线蕉97 |
麻豆av久久av盛宴av |