作中我們經(jīng)常會(huì)遇到要建立多個(gè)線(xiàn)程,以此方便于我們可以同時(shí)執(zhí)行多個(gè)事件??荚嚧笠彩窃赩C開(kāi)發(fā)中的一項(xiàng)基礎(chǔ),雖然曾多次用到,但也會(huì)常常忘記。
在VC中,無(wú)非是創(chuàng)建線(xiàn)程和寫(xiě)線(xiàn)程函數(shù)
1, 創(chuàng)建線(xiàn)程:
#include
在MFC中通常在OnInitDialog()下面創(chuàng)建線(xiàn)程
//定義參數(shù):SerialControl
//------------------變量函數(shù)初始化調(diào)用區(qū)域--------
CSerialControl * m_SerialControl=new CSerialControl();
m_SerialControl->Create(NULL,\"aa\",WS_CHILD,CRect(0,0,0,0),this,2,NULL);
m_SerialControl->InitAllSerialPort();
//------------------------------------------------
HANDLE hThread1=CreateThread(NULL,0,DetectCar,(LPVOID)SerialControl,0,NULL);
CloseHandle(hThread1);//此處關(guān)閉線(xiàn)程的句柄,但不意味關(guān)閉線(xiàn)程,線(xiàn)程在程序退出時(shí)關(guān)閉
參數(shù)說(shuō)明:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//必須為NULL
DWORD dwStackSize, //一般為0 ,表示堆棧與外部大小相同
LPTHREAD_START_ROUTINE lpStartAddress, //線(xiàn)程函數(shù)名稱(chēng)
LPVOID lpParameter, //傳遞給線(xiàn)程函數(shù)的參數(shù),如果為多個(gè),自定義結(jié)構(gòu)體
DWORD dwCreationFlags, //0表示創(chuàng)建線(xiàn)程后立即啟動(dòng)線(xiàn)程,如果不是立即啟動(dòng)需要調(diào)用ResumeThread函數(shù)
LPDWORD lpThreadId);//用來(lái)標(biāo)記該線(xiàn)程的名稱(chēng)
2, 定義線(xiàn)程函數(shù):
//函數(shù)的定義
static DWORD WINAPI DetectCar(LPVOID lpParameter); //一般用靜態(tài)函數(shù)
//remark:由于線(xiàn)程函數(shù)是靜態(tài)函數(shù),如果要在函數(shù)中用到對(duì)象,必須通過(guò)
//函數(shù)的實(shí)現(xiàn)
/***************************************************
*作者:萬(wàn)田
*時(shí)間:2007-13-03
*函數(shù):DetectCar() 說(shuō)明:檢測(cè)線(xiàn)程
****************************************************/
DWORD WINAPI CISSDlg::DetectCar(LPVOID lpParameter)
{
TRACE(\"Thread DetectCar is running\\r\\n\");
CSerialControl* SControl=(CSerialControl*)lpParameter;
//define:record which road is car
int Carexit=0;
while (TRUE)//do this forever
{
//get:which road exit car
Carexit=SControl->m_GroudDetector1.CarExists();
***********
}
return true;
}
在VC中,無(wú)非是創(chuàng)建線(xiàn)程和寫(xiě)線(xiàn)程函數(shù)
1, 創(chuàng)建線(xiàn)程:
#include
在MFC中通常在OnInitDialog()下面創(chuàng)建線(xiàn)程
//定義參數(shù):SerialControl
//------------------變量函數(shù)初始化調(diào)用區(qū)域--------
CSerialControl * m_SerialControl=new CSerialControl();
m_SerialControl->Create(NULL,\"aa\",WS_CHILD,CRect(0,0,0,0),this,2,NULL);
m_SerialControl->InitAllSerialPort();
//------------------------------------------------
HANDLE hThread1=CreateThread(NULL,0,DetectCar,(LPVOID)SerialControl,0,NULL);
CloseHandle(hThread1);//此處關(guān)閉線(xiàn)程的句柄,但不意味關(guān)閉線(xiàn)程,線(xiàn)程在程序退出時(shí)關(guān)閉
參數(shù)說(shuō)明:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//必須為NULL
DWORD dwStackSize, //一般為0 ,表示堆棧與外部大小相同
LPTHREAD_START_ROUTINE lpStartAddress, //線(xiàn)程函數(shù)名稱(chēng)
LPVOID lpParameter, //傳遞給線(xiàn)程函數(shù)的參數(shù),如果為多個(gè),自定義結(jié)構(gòu)體
DWORD dwCreationFlags, //0表示創(chuàng)建線(xiàn)程后立即啟動(dòng)線(xiàn)程,如果不是立即啟動(dòng)需要調(diào)用ResumeThread函數(shù)
LPDWORD lpThreadId);//用來(lái)標(biāo)記該線(xiàn)程的名稱(chēng)
2, 定義線(xiàn)程函數(shù):
//函數(shù)的定義
static DWORD WINAPI DetectCar(LPVOID lpParameter); //一般用靜態(tài)函數(shù)
//remark:由于線(xiàn)程函數(shù)是靜態(tài)函數(shù),如果要在函數(shù)中用到對(duì)象,必須通過(guò)
//函數(shù)的實(shí)現(xiàn)
/***************************************************
*作者:萬(wàn)田
*時(shí)間:2007-13-03
*函數(shù):DetectCar() 說(shuō)明:檢測(cè)線(xiàn)程
****************************************************/
DWORD WINAPI CISSDlg::DetectCar(LPVOID lpParameter)
{
TRACE(\"Thread DetectCar is running\\r\\n\");
CSerialControl* SControl=(CSerialControl*)lpParameter;
//define:record which road is car
int Carexit=0;
while (TRUE)//do this forever
{
//get:which road exit car
Carexit=SControl->m_GroudDetector1.CarExists();
***********
}
return true;
}

