C技巧:VC中創(chuàng)建多個(gè)線(xiàn)程的方法

字號(hào):

作中我們經(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;
    }