锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
璋冭瘯蹇嵎閿?br />璋冭瘯.鏂偣 F9 璁劇疆鎴栧彇娑堟柇鐐?br />璋冭瘯.鍚敤鏂偣 Ctrl + F9 灝嗘柇鐐逛粠紱佺敤鍒囨崲鍒板惎鐢?br />璋冭瘯.鍒犻櫎鎵鏈夋柇鐐?nbsp; Ctrl + Shift + F9 娓呴櫎欏圭洰涓殑鎵鏈夋柇鐐廣?/p>
鏂囨湰閫夋嫨蹇嵎閿?br />緙栬緫.鍚戝乏鎵╁睍涓涓瓧絎?nbsp; Shift + 鍚戝乏閿?nbsp; 灝嗗厜鏍囧乏縐諱竴涓瓧絎︿互鎵╁睍鎵閫夊唴瀹廣?br />緙栬緫.鍚戝彸鎵╁睍涓涓瓧絎?nbsp; Shift + 鍚戝彸閿?nbsp; 灝嗗厜鏍囧彸縐諱竴涓瓧絎︿互鎵╁睍鎵閫夊唴瀹廣?br />緙栬緫.鏂囨。緇撳熬鎵╁睍 Ctrl + Shift + End 閫夋嫨浠庢彃鍏ョ偣鍒版枃妗f渶鍚庝竴琛岀殑鏂囨湰銆?br />緙栬緫.鏂囨。寮濮嬫墿灞?nbsp; Ctrl + Shift + Home 閫夋嫨浠庢彃鍏ョ偣鍒版枃妗i琛岀殑鏂囨湰銆?br />緙栬緫.鍚戜笅鎵╁睍涓琛?nbsp; Shift + 鍚戜笅閿?nbsp; 浠庢彃鍏ョ偣浣嶇疆寮濮嬶紝灝嗛夊畾鏂囨湰鍚戜笅鎵╁睍涓琛屻?br />緙栬緫.鎵╁睍鍒拌灝?nbsp; Shift + End 閫夋嫨浠庢彃鍏ョ偣鍒板綋鍓嶈琛屽熬鐨勬枃鏈?br />緙栬緫.鎵╁睍鍒拌棣?nbsp; Shift + Home 閫夋嫨浠庢彃鍏ョ偣鍒拌棣栫殑鏂囨湰銆?br />緙栬緫.鍚戜笂鎵╁睍涓琛?nbsp; Shift + 鍚戜笂閿?nbsp; 浠庢彃鍏ョ偣浣嶇疆寮濮嬪悜涓婇愯閫夋嫨鏂囨湰銆?
緙栬緫.鍚戜笅鎵╁睍涓欏?nbsp; Shift + Page Down 灝嗛夊畾鍐呭鍚戜笅鎵╁睍涓欏點?br />緙栬緫.鍚戜笂鎵╁睍涓欏?nbsp; Shift + Page Up
瀵硅薄嫻忚鍣ㄥ揩鎹烽敭
緙栬緫.杞埌澹版槑 Ctrl + F12 鏄劇ず浠g爜涓夊畾絎﹀彿鐨勫畾涔夈?br />緙栬緫.杞埌瀹氫箟 F12 鏄劇ず浠g爜涓夊畾絎﹀彿鐨勫0鏄庛?/p>
綾誨叧緋誨浘蹇嵎閿?br />綾誨叧緋誨浘.鎶樺彔 鏁板瓧閿尯涓殑 -錛堝噺鍙鳳級 鎶樺彔“綾昏緇嗕俊鎭?#8221;紿楀彛涓睍寮鐨勮妭鐐癸紝鎴栨姌鍙犲叧緋誨浘涓夊畾鐨勫艦鐘墮殧紱昏埍銆?
綾誨叧緋誨浘.灞曞紑 鏁板瓧閿尯涓殑 +錛堝姞鍙鳳級 灞曞紑“綾昏緇嗕俊鎭?#8221;紿楀彛涓姌鍙犵殑鑺傜偣錛屾垨灞曞紑鍏崇郴鍥句腑閫夊畾鐨勫艦鐘墮殧紱昏埍銆?/p>
涓涓嬪唴瀹瑰湪vs2005瀹炵幇
鏂板緩涓涓┖鐨剋in32鎺у埗鍙伴」鐩?
1.棣栧厛鎴戜滑鏉ラ厤緗ご鏂囦歡鍜屽簱鏂囦歡:
澶存枃浠?
搴撴枃浠?鏃?瑙佷唬鐮?
涓嬮潰灝辨槸cpp鍐呭浜?娉ㄩ噴閮芥槸涓漢鐞嗚В,濡傛灉鎮ㄨ寰椾笉瀵?/p>
嬈㈣繋鎵硅瘎鎸囨.
浣跨敤vs2005緙栬瘧luabind
綰㈣壊閮ㄥ垎鏄垜鑷繁緙栬瘧鐨勬椂鍊欓亣鍒扮殑涓浜涢棶棰?鎴栬呭簲璇ユ敞鎰忕殑鍦版柟
鍙﹀,鎴戜慨鏀逛簡boost_1_41_0\tools\build\v2\user-config.jam鏂囦歡涓殑 # using msvc : 8.0;
鏀瑰悗: # using msvc : 8.0 : : <compileflags>/wd4819 <compileflags>/D_CRT_SECURE_NO_DEPRECATE <compileflags>/D_SCL_SECURE_NO_DEPRECATE <compileflags>/D_SECURE_SCL=0 ;
涓嶇煡閬撹繖浼氫笉浼氬緙栬瘧閫犳垚褰卞搷.
綰跨▼鍒嗕負鐣岄潰綰跨▼鍜屽伐浣滆呯嚎紼嬶紝鐣岄潰瀹為檯灝辨槸涓涓嚎紼嬬敾鍑烘潵鐨勪笢瑗匡紝榪欎釜綰跨▼緇存姢涓涓?#8220;娑堟伅闃熷垪”錛?#8220;娑堟伅闃熷垪”涔熸槸鐣岄潰綰跨▼鍜屽伐浣滆呯嚎紼嬬殑鏈澶у尯鍒紝榪欎釜璇嶅簲璇ヨ繘鍒頒綘鐨勮剳瀛愰噷錛屾牴娣辮拏鍥虹殑錛?/p>
濡傛灉鍦ㄧ晫闈㈢嚎紼嬬殑鏌愪釜鍦版柟鍋滀綇錛岃繖璇存槑瀹冨鐞嗕笉浜嗙獥鍙f秷鎭簡錛屾墍浠ユ湁鏃跺欐垜浠氨浼氱湅鍒版暣涓晫闈㈡棤鍝嶅簲浜嗐傝繖縐嶉棶棰樺悗闈細鎻愪緵涓涓彨銆WaitForObjectEx銆鐨勫嚱鏁版潵瑙e喅錛屾垜浠悗闈㈠啀璋堛?/p>
綰跨▼棣栧厛灝辨槸瀹冪殑鍒涘緩錛屽垱寤烘槸鐢ㄤ笅闈㈣繖涓嚱鏁幫細CreateThread;銆鍏蜂綋鐨勫弬鏁版垜涓嶈浜嗭紝鑷繁鏌ワ輯錛籌激錛傚叾涓殑銆Thread1銆鏄嚎紼嬪嚱鏁般傜嚎紼嬪嚱鏁版槸涓涓叏灞鍑芥暟錛屽涓嬶細
DWORD WINAPI Thread1(LPVOID lpParam)
{
while(1)
{
OutputDebugString("11111");
Sleep(10);
}
return 0;
}
// 涓嬮潰榪欎竴鍙ユ槸鍒涘緩綰跨▼
CreateThread(NULL, 0, Thread1, 0, 0, NULL);
褰撶劧鎴戜滑涓嶈兘璁╀竴涓嚎紼嬭嚜鐢熻嚜鐏紝閭f牱鏈夊彲鑳藉湪浣犻鍑虹▼搴忕殑鏃跺欏嚭鐜頒竴浜涜帿鍚嶅叾濡欑殑闂錛屾垨鑰呬涪澶變竴浜涙暟鎹紝鎴栬呯粰浣犲脊涓涓穿婧冪殑瀵硅瘽妗嗙瓑絳夈傘傘?/p>
鎵浠ユ垜浠氨瑕佸榪欎釜綰跨▼榪涜綆$悊錛岄鍏堝氨鏄瀹冮鍑恒?/p>
鎴戜滑緇欏畠鐨剋hile鍔犱笂涓涓?BOOL 鍙橀噺 g_bExitThread鐨勫垽鏂紝榪欐牱鐨勮瘽錛岀嚎紼嬪嚱鏁板氨鍙樻垚涓嬮潰榪欐牱錛?/p>
DWORD WINAPI Thread1(LPVOID lpParam)
{
while(!g_bExitThread)
{
OutputDebugString("11111");
Sleep(10);
}
return 0;
}
鐒跺悗鍦ㄩ渶瑕佸畠閫鍑虹殑鏃跺欐妸g_bExitThread璁句負TRUE錛岃〃紺猴紝鍠傦紝鍏勫紵錛屼綘璇ラ鍑轟簡銆?/p>
褰撶劧鎴戜滑榪樿鐭ラ亾瀹冩槸鍚︽垚鍔熼鍑轟簡錛屽洜涓虹嚎紼嬪彞鏌勬槸涓涓唴鏍稿璞★紝鎵浠ユ垜浠氨瑕佺敤鍒癢indows鐨刉aitForSingleObject鏉ョ瓑寰呬簡銆傚垱寤虹殑鏃跺欏拰絳夊緟瀹冮鍑虹殑浠g爜灝辮鏀瑰彉浜嗭紝澶氫簡涓涓?HANDLE g_hTrd鐨勫彉閲忥細
// 鍒涘緩
g_bExitThread = FALSE;
g_hTrd = CreateThread(NULL, 0, Thread1, 0, 0, NULL);
// 絳夊緟綰跨▼緇撴潫
g_bExitThread = TRUE;
if(g_hTrd != NULL)
{
DWORD dwRet = WaitForSingleObject(g_hTrd, 5000);
if(dwRet == WAIT_OBJECT_0)
{
AfxMessageBox("Thread exit success!");
}
else
{
DWORD dwRet = 0;
GetExitCodeThread(g_hTrd, &dwRet);
TerminateThread(g_hTrd, dwRet);
AfxMessageBox("Thread exit, but not all ok!");
}
CloseHandle(g_hTrd);
g_hTrd = NULL;
}
涓婇潰璇翠簡鍦ㄧ晫闈㈢嚎紼嬮噷絳夊緟鍒殑綰跨▼緇撴潫錛屼篃灝辨槸浣跨敤 WaitForSingleObject 鐨勬椂鍊欎細闃誨鏁翠釜紿楀彛娑堟伅鐨勫鐞嗭紝鎵浠ユ垜浠鏋滃湪鐣岄潰綰跨▼閲岃絳夊緟鍒殑鍐呮牳瀵硅薄鏃訛紝鎴戜滑瑕侀噰鐢ㄨ繖縐?#8220;絳変竴涓嬶紝澶勭悊涓涓嬬晫闈㈡秷鎭?#8221;鐨勬柟娉曘傛垜宸茬粡鍐欏ソ浜嗕竴涓?WaitForObjectEx 鐨勫嚱鏁幫紝濡備笅錛?/p>
// 姝ゅ嚱鏁板彧鑳界敤浜庣晫闈㈢嚎紼?br />static DWORD WaitForObjectEx( HANDLE hHandle, DWORD dwMilliseconds )
{
BOOL bRet;
MSG msg;
INT iWaitRet;
int nTimeOut = 0;
while( (bRet = ::GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if(nTimeOut++ * 20 >= dwMilliseconds)
break;
iWaitRet = WaitForSingleObject(hHandle, 20);
if(iWaitRet != WAIT_TIMEOUT)
{
break;
}
if (bRet == -1)
{
break;
}
else
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
return iWaitRet;
}
寰堝鏃跺欙紝鎴戜滑涓嶆兂鎶婄嚎紼嬩綔涓轟竴涓叏灞鍑芥暟鏉ヤ嬌鐢紝鎵浠ヨ繖涓椂鍊欐垜浠妸綰跨▼浣滀負涓涓被鐨勯潤鎬佹垚鍛樺璞℃潵鍐欍傚綋鐒朵篃涓嶈兘灝戜簡鍒氭墠鐨勪袱涓彉閲忥細閫鍑烘爣蹇楀拰綰跨▼鍙ユ焺銆傦紙璁捐繖涓被鏄疌TestThreadDlg錛?/p>
// H 鏂囦歡
BOOL m_bExitThread;
HANDLE m_hTrd;
static DWORD WINAPI Thread1(LPVOID lpParam);
// CPP鏂囦歡錛屽垱寤虹殑鏃跺欐妸 this 鎸囬拡浼犺繘鍘伙紝鍥犱負綾婚潤鎬佹垚鍛樺嚱鏁頒笉鑳借闂被鐨勯潪闈欐佹垚鍛橈紝娌℃湁this鎸囬拡
//錛圕++鐨勭煡璇嗙偣錛?br /> m_bExitThread = FALSE;
m_hTrd = CreateThread(NULL, 0, Thread1, this, 0, NULL);
綰跨▼鍑芥暟鍙樻垚浜嗭細
DWORD WINAPI CTestThreadDlg::Thread1(LPVOID lpParam)
{
CTestThreadDlg *pDlg = (CTestThreadDlg*)lpParam;
while(!pDlg->m_bExitThread)
{
OutputDebugString("11111");
Sleep(10);
}
return 0;
}
褰撴湁鍑犱釜綰跨▼涓璧瘋窇鐨勬椂鍊欙紝鎴戜滑灝辮娉ㄦ剰綰跨▼鐨勫悓姝ラ棶棰樹簡錛岀嚎紼嬬殑鍚屾涓鑸潵璇達紝鏄湪澶氫釜綰跨▼鍏辯敤浜嗚祫婧愮殑鏃跺欍傛瘮濡備袱涓嚎紼嬮兘鐢ㄥ埌浜嗗悓涓涓猇ECTOR錛岄兘瀵筕ECTOR榪涜鎻掑叆鎿嶄綔錛屼笉騫哥殑鏄紝VECTOR涓嶆槸綰跨▼瀹夊叏鐨勶紝榪欎釜鏃跺欑▼搴忓氨浼氬穿婧冿紝鎵浠ユ垜浠氨瑕佸VECTOR榪欎釜璧勬簮鍋氬悓姝ワ紝鍚屾鐨勬剰鎬濇槸“鎴戣闂殑鏃跺欙紝浣犵瓑寰?#8221;銆傜▼搴忓ぇ鑷村涓嬶細
DWORD WINAPI CTestThreadDlg::Thread1(LPVOID lpParam)
{
CTestThreadDlg *pDlg = (CTestThreadDlg*)lpParam;
while(!pDlg->m_bExitThread)
{
OutputDebugString("11111");
pDlg->m_csForVec.Lock();
pDlg->m_vecTest.push_back("111");
pDlg->m_csForVec.Unlock();
Sleep(10);
}
return 0;
}
DWORD WINAPI CTestThreadDlg::Thread2(LPVOID lpParam)
{
CTestThreadDlg *pDlg = (CTestThreadDlg*)lpParam;
while(!pDlg->m_bExitThread2)
{
OutputDebugString("222");
pDlg->m_csForVec.Lock();
pDlg->m_vecTest.push_back("222");
pDlg->m_csForVec.Unlock();
Sleep(10);
}
return 0;
}
m_csForVec 鏄竴涓狢CriticalSection鍙橀噺錛岃繖涓悓姝ュ璞″拰鍏朵粬鐨勫悓姝ュ彉閲忥紙浜嬩歡銆佷俊鍙烽噺銆佷簰鏂ュ尯絳夛級鏈変竴浜涗笉涓鏍鳳紝渚嬪鍙兘鍦ㄥ悓涓涓繘紼嬬殑綰跨▼闂磋闂佸湪鎿嶄綔緋葷粺鐨勭敤鎴鋒佽闂紝鍏朵粬鐨勫繀欏昏繘鍏ユ牳蹇冩併傛墍浠ヨ繖鏍峰鑷翠簡榪欑鍏抽敭鍖虹殑鏍稿績瀵硅薄鐨勯熷害瑕佹瘮鍏朵粬鐨勫揩100鍊嶅乏鍙熾傘傘?/p>
涓婇潰宸茬粡璇翠簡綰跨▼鐨勫垱寤恒佺鐞嗭紙閫鍑虹嚎紼嬨佺瓑寰呯嚎紼嬶級銆佸悓姝ョ瓑錛岄偅鎴戜滑鍙戠幇浜嗕粈涔堝叡鎬у憿錛熶綔涓轟竴涓▼搴忓憳錛屾垜浠寰堟晱鎰熺殑鍙戠幇榪欎簺浠g爜涓婄殑鍏辨э紝榪欐槸鎴戜滑璁捐浠g爜鐨勪富瑕佸墠鎻愩?/p>
棣栧厛鎴戜滑鍙戠幇涓婇潰鐨勭嚎紼嬮兘鏈変袱涓彉閲忥細
BOOL m_bExitThread; // 璁╃嚎紼嬮鍑虹殑鏍囧織
HANDLE m_hTrd; // 綰跨▼鍙ユ焺
鍙﹀鎴戜滑WaitForSingleObject 鐨勬椂鍊欎笉鑳芥棤闄愮瓑寰咃紝鎵浠ヨ澶氫竴涓?DWORD m_dwWaitTimeOut;
鐢變簬鎴戞兂鎶婄嚎紼嬪惎鍔ㄥ拰緇撴潫灝佽璧鋒潵錛屾墍浠ユ垜璁捐浜嗚繖鍑犱釜鎺ュ彛錛?/p>
BOOL Start(LPVOID lpParam); // 鍚姩綰跨▼錛岀嚎紼嬫墍闇瑕佺殑鍙傛暟浠庤繖閲屼紶榪?br /> BOOL End(); // 緇撴潫綰跨▼
virtual void Run(); // 閲嶅啓Run鍑芥暟
鎵浠ユ暣涓殑綰跨▼灝佽鎴愪互涓嬬殑綾伙細
// MyThread.h
#ifndef MY_THREAD_H
#define MY_THREAD_H
class CMyThread
{
public:
CMyThread();
virtual ~CMyThread();
BOOL Start(LPVOID lpParam);
BOOL End();
virtual void Run();
protected:
static DWORD WINAPI Thread(LPVOID lpParam);
void RunOnceEnd();
DWORD m_dwWaitTimeOut;
BOOL m_bExitThread;
HANDLE m_hTrd;
LPVOID m_lpParam;
};
#endif
// MyThread.Cpp
#include "stdafx.h"
#include "MyThread.h"
/////////////////////////////////////////////////////////////////////////////
// CMyThread
CMyThread::CMyThread()
{
m_bExitThread = FALSE;
m_hTrd = NULL;
m_dwWaitTimeOut = 5000;
}
CMyThread::~CMyThread()
{
}
BOOL CMyThread::Start(LPVOID lpParam)
{
m_lpParam = lpParam;
m_bExitThread = FALSE;
m_hTrd = CreateThread(NULL, 0, Thread, this, 0, NULL);
return TRUE;
}
BOOL CMyThread::End()
{
m_bExitThread = TRUE;
if(m_hTrd != NULL)
{
DWORD dwRet = WaitForSingleObject(m_hTrd, m_dwWaitTimeOut);
if(dwRet == WAIT_OBJECT_0)
{
AfxMessageBox("Thread exit success!");
}
else
{
DWORD dwRet = 0;
GetExitCodeThread(m_hTrd, &dwRet);
TerminateThread(m_hTrd, dwRet);
AfxMessageBox("Thread fucking exit!");
}
CloseHandle(m_hTrd);
m_hTrd = NULL;
}
return TRUE;
}
DWORD WINAPI CMyThread::Thread(LPVOID lpParam)
{
CMyThread *pTrd = (CMyThread *)lpParam;
while(!pTrd->m_bExitThread)
{
pTrd->Run();
}
return 0;
}
void CMyThread::RunOnceEnd()
{
m_bExitThread = TRUE;
CloseHandle(m_hTrd);
m_hTrd = NULL;
}
void CMyThread::Run()
{
}
鎴戜滑闇瑕佸啓鎴戜滑鑷繁鐨勭嚎紼嬬殑鏃跺欏氨閲嶈澆涓涓嬭繖涓猂un鍑芥暟
// 媧劇敓鍑轟竴涓被
class CMyThread1 : public CMyThread
{
public:
virtual void Run();
};
// 鏀瑰啓Run鍑芥暟
void CMyThread1::Run()
{
CTestThreadDlg *pDlg = (CTestThreadDlg *)m_lpParam;
OutputDebugString("222");
pDlg->m_csForVec.Lock();
pDlg->m_vecTest.push_back("222");
pDlg->m_csForVec.Unlock();
Sleep(10);
// 濡傛灉姝ょ嚎紼嬪彧鎯寵繍琛屼竴嬈★紝鍔犱笂涓嬮潰榪欏彞
RunOnceEnd();
}
鐒跺悗鎴戜滑涔嬪墠鐨勪袱涓嚎紼嬬殑浣跨敤灝卞彉鎴愪簡涓嬮潰鐨勫艦寮忥細
CMyThread1 g_t1, g_t2, g_t3;
void CTestThreadDlg::OnButton3()
{
g_t1.Start(this);
g_t2.Start(this);
g_t3.Start(this);
}
void CTestThreadDlg::OnButton4()
{
g_t1.End();
g_t2.End();
g_t3.End();
}
鍙渶瑕佷互涓嬪嚑姝ワ細
1銆佹淳鐢熻嚜宸辯殑綰跨▼綾?br />2銆侀噸杞絉un鍑芥暟
3銆佽皟鐢⊿tart鍚姩綰跨▼
4銆佽皟鐢‥nd緇撴潫綰跨▼
褰撶劧榪欑灝佽鏂瑰紡鏄垜鑷繁鍠滄鐨勶紝灝佽鐨勭洰鐨勬槸鏂逛究浣跨敤錛岄殣钘忕粏鑺傦紝璇鎬綅鐪嬪畼涔熷彲浠ユ牴鎹嚜宸辯殑鍠滃ソ錛屽皝瑁呯嚎紼嬬殑浣跨敤鏂規硶錛屽鏋滆兘鍦ㄦ鍏紑涓涓嬩綘鐨勬垚鏋滐紝璁╂垜鍜屽ぇ瀹墮兘瀛︿範涓涓嬩綘鐨勮璁℃墜娉曪紝閭e氨鐪熸槸very good and 3q浜嗭紒
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/dylgsy/archive/2008/03/13/2176160.aspx