文件vc多線程編程VC中使用比較廣泛而且實(shí)用,在網(wǎng)上看到教程.感覺寫挺好_第1頁
文件vc多線程編程VC中使用比較廣泛而且實(shí)用,在網(wǎng)上看到教程.感覺寫挺好_第2頁
文件vc多線程編程VC中使用比較廣泛而且實(shí)用,在網(wǎng)上看到教程.感覺寫挺好_第3頁
文件vc多線程編程VC中使用比較廣泛而且實(shí)用,在網(wǎng)上看到教程.感覺寫挺好_第4頁
文件vc多線程編程VC中使用比較廣泛而且實(shí)用,在網(wǎng)上看到教程.感覺寫挺好_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

VC多線程編一、問題的提編寫一個(gè)耗時(shí)的單線程程序新建一個(gè)基于框的應(yīng)用程序SingleThread,在主框IDD_SINGLETHREAD_DIALOGvoid{Sleep(6000);6}二、多線程概進(jìn)線程都是操作系統(tǒng)的概念主執(zhí)行線程以函數(shù)地址形式mainWinMain數(shù),將程序的啟動(dòng)Windows。的計(jì)算機(jī)都是單處理器(CPU)的,為了運(yùn)行所有這些線程,操作系統(tǒng)為每個(gè)獨(dú)立線程CPU此可見,如果兩個(gè)非?;钴S的線程為了搶奪對(duì)CPU的控制權(quán),程切換時(shí)會(huì)消耗很多的CPU資源,Win32SDK數(shù)支持進(jìn)行多線程的程序設(shè)計(jì),并提供了操作系統(tǒng)原理中的各種同步、互斥和臨界區(qū)等操作。VisualC++6.0MFC實(shí)現(xiàn)了多線程的程序設(shè)計(jì),使得多線程編程更三、Win32API多線程編程的支Win32提供了一系列的API數(shù)來完成線程的創(chuàng)建、掛起、恢復(fù)、終結(jié)以及通信等工作。下面1、HANDLECreateThread(LPSECURITY_ATTRIBUTESDWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);lpThreadAttributes:指向一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu)的指針,該結(jié)構(gòu)決定了線程的安全屬性,一般置為NULL;(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc是線程函數(shù)名;lpParameter:指定了線程執(zhí)行時(shí)傳送32參數(shù),即線程函數(shù)的參數(shù);dwCreationFlags:控制線程創(chuàng)建的附加標(biāo)志,可以取兩種值。如果該參數(shù)為0,線被創(chuàng)建后就會(huì)立即開始執(zhí)行;如果該參數(shù)為CREATE_SUSPENDED,則系統(tǒng)產(chǎn)生線程后,該線程處于掛起狀態(tài),并不馬上執(zhí)行,直至ResumeThread用;lpThreadId:該參數(shù)返回所創(chuàng)建線程的2、DWORDSuspendThread(HANDLE3、DWORDResumeThread(HANDLE該函數(shù)用于結(jié)束線程的掛起狀態(tài),執(zhí)行線程4、VOIDExitThread(DWORD5、BOOLTerminateThread(HANDLEhThread,DWORD6、BOOLPostThreadMessage(DWORDidThread,UINTMsg,RAMram,LPARAMlParam);idThread:將接收消息的線ID;四、Win32API線程編程例1建立一個(gè)基于框的工程MultiThread1,在框IDD_MULTITHREAD1_DIALOG中加入兩個(gè)按鈕和一個(gè)編輯框,兩個(gè)按鈕的ID別是IDC_START,IDC_STOP,標(biāo)題分別為“啟動(dòng)”,“停止”,IDC_STOP屬性Disabled;編輯IDIDC_TIME,屬性選中Read-only;在MultiThread1Dlg.h文件中添加線程函數(shù):void注意,線程函數(shù)的應(yīng)在類CMultiThread1Dlg的外部。在類CMultiThread1Dlg內(nèi)部添protected型變量: HANDLEhThread;DWORDThreadID;分別代表線程的句柄和IDMultiThread1Dlg.cppm_bRun:volatileBOOLm_bRun;m_bRun代表線程是否正在運(yùn)行。你要留意到全局變量m_bRun是使用volatile修飾符的,volatile修飾符的作用是告訴編譯的全局變量來說,volatile是一個(gè)非常重要的修飾符。編寫線程函數(shù):void{CTimetime;CStringstrTime;{::SetDlgItemText((AfxGetApp()->GetMainWnd())-}}雙擊IDC_START完成該按鈕的消息函數(shù):void{}雙擊IDC_STOP鈕,完成該按鈕的消息函數(shù):void{}編譯并運(yùn)行該例Win32API多線2立一個(gè)基于框的工程MultiThread2,在框IDD_MULTITHREAD2_DIALOG中加入一個(gè)編輯框和一個(gè)按鈕,IDIDC_COUNT,IDC_START,按鈕控件的標(biāo)題為“開始”;在MultiThread2Dlg.h文件中添加線程函數(shù):voidThreadFunc(int注意,線程函數(shù)的應(yīng)在類CMultiThread2Dlg的外部。在類CMultiThread2Dlg添加protected量:HANDLEDWORD分別代表線程的句柄和ID添加:voidThreadFunc(intinteger){inti;{}}雙擊IDC_START完成該按鈕的消息函數(shù):void{intinteger=m_nCount;}DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);hHandle象(一般為同步對(duì)象,也可以是線程)的句柄;dwMillisecondshHandle象所設(shè)置的超時(shí)值,單位為毫秒;掛起的dwMilliseconds線程所等待的對(duì)象變?yōu)橛行盘?hào)狀態(tài),則該函數(shù)立即返回;如果超時(shí)時(shí)間dwMillisecondshHandle指向的對(duì)象還沒有變成有信號(hào)狀態(tài),函數(shù)照樣返回。dwMilliseconds具有特殊意義的值:0INFINITE。若為0,則該函數(shù)立即返回;若為INFINITE,則線程一直被掛hHandle指向的對(duì)象變?yōu)橛行盘?hào)狀態(tài)時(shí)為止。3typedef{intfirstArgu,longsecondArgu,…創(chuàng)建線threadFunc數(shù)內(nèi)部,可以使用“強(qiáng)制轉(zhuǎn)換”:intintValue=((pMyType)lpvoid)->firstArgu;longlongValue=((pMyType)lpvoid)->seconddArgu;例程3MultiThread3演示如何傳送一個(gè)指向結(jié)構(gòu)體的指針參數(shù)IDC_MILLISECOND,一個(gè)按鈕IDC_START,標(biāo)題為“開始”,一個(gè)進(jìn)度條IDC_PROGRESS1;打開ClassWizard,為編輯框IDC_MILLISECOND添加int型變量m_nMilliSecond,為進(jìn)度條IDC_PROGRESS1CProgressCtrl變量m_ctrlProgress;MultiThread3Dlg.h件中添加一個(gè)結(jié)構(gòu)的定義:struct{UINTnMilliSecond;CProgressCtrl*pctrlProgress;線程函數(shù)的:UINTThreadFunc(LPVOID注意,二者應(yīng)在類CMultiThread3Dlg在類CMultiThread3Dlg添加protected量HANDLEDWORD分別代表線程的句柄和IDMultiThread3Dlg.cpp下操作:定義公共變量threadInfoInfo;雙擊IDC_START,添加相應(yīng)消息處理函數(shù):void{}在函數(shù)BOOLCMultiThread3Dlg::OnInitDialog()中添加語句{return //return unlessyousetthefocustoa}添加線程處理函UINTThreadFunc(LPVOIDlpParam){threadInfo*pInfo=(threadInfo*)lpParam;for(inti=0;i<100;i++){intnTemp=pInfo->nMilliSecond;}return}()WaitForSingleObject函數(shù)等待子線程(ThreadFunc)結(jié)束時(shí),導(dǎo)致了線程死鎖。因?yàn)榫€程都在互相等待,死鎖發(fā)生了,編應(yīng)注意避免。4該例Windows最多可創(chuàng)建線程的IDC_TEST個(gè)編IDC_COUNT,按鈕標(biāo)題為“測(cè)試”,編輯框Read-only;MultiThread4Dlg.cpp下操作:添加volatileBOOLDWORDWINAPIthreadFunc(LPVOID{{}return}只要m_bRunFlag變量為TRUE,線程一直運(yùn)行雙擊IDC_TEST,添加其響應(yīng)消息函數(shù):void{DWORDlongnCount=0;{{}{}}}五、MFC對(duì)多線程編程的支CWinThread*AfxBeginThread(AFX_THREADPROCLPVOIDpParam,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL下:UINTExecutingFunction(LPVOIDpParam);返回0執(zhí)行成功。先級(jí)。如果為nStackSize:線程為自己分配堆棧的大小,其單位為字節(jié)。如果nStackSize0,則線程的堆棧dwCreateFlags:如果為0,則線創(chuàng)建后立刻開始執(zhí)行。如果為CREATE_SUSPEND,則線創(chuàng)建lpSecurityAttrs:線程的安全屬性指針,一般為CWinThread*AfxBeginThread(CRuntimeClass*intnPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULLpThreadClass是指向CWinThread的一個(gè)導(dǎo)出類的運(yùn)行時(shí)類對(duì)象類定義了被下面我們對(duì)CWinThread成員及常用函數(shù)進(jìn)行簡(jiǎn)要說明m_nThreadID:當(dāng)ID;BOOLCWinThread::CreateThread(DWORDdwCreateFlags=0,UINTnStackSize=0,LPSECURITY_ATTRIBUTES對(duì)應(yīng)參數(shù)有相同含義,該函數(shù)執(zhí)行成功,返0否則返回0。一般情況下,調(diào)用AfxBeginThread()來地創(chuàng)建并啟動(dòng)一個(gè)線程,但是也可以通過兩步法virtualBOOL面線程經(jīng)常重載該函數(shù),工作者線程一般不InitInstance()。virtualint0標(biāo)識(shí)InitInstance()成員函數(shù)一樣,該函數(shù)也只適用于用戶界面線程。六、MFC多線程編程,在VisualC++6.0編程環(huán)境中可以編寫C風(fēng)格的32位Win32應(yīng)用程序,也可以利用MFCC++風(fēng)格的應(yīng)用程序,二者各有其優(yōu)缺點(diǎn)?;鵚in32應(yīng)用程序執(zhí)行代碼小巧,運(yùn)行應(yīng)用程序可以快速建立起應(yīng)用程序,類庫為程序員提供了大量的封裝類,而且DeveloperStudio簡(jiǎn)捷和功能強(qiáng)大等優(yōu)越性,因此除非有特殊的需要,否則VisualC++推薦MFC開,我們知道,MFC中的線程分為兩種:用戶界面線工作者線程。分別舉例說明。用MFC類庫編程實(shí)現(xiàn)工作者線程5為了與Win32APIMFC類庫編程實(shí)現(xiàn)例3MultiThread3IDC_MILLISECOND,一個(gè)按鈕IDC_START,標(biāo)題為“開始”,一個(gè)進(jìn)度條IDC_PROGRESS1;打開ClassWizard,為編輯框IDC_MILLISECOND添加int型變量m_nMilliSecond,為進(jìn)度條IDC_PROGRESS1CProgressCtrl變量m_ctrlProgress;MultiThread5Dlg.h件中添加一個(gè)結(jié)構(gòu)struct{UINTnMilliSecond;CProgressCtrl*pctrlProgress;線程函數(shù)的:UINTThreadFunc(LPVOID注意,二者應(yīng)在類CMultiThread5Dlg在類CMultiThread5Dlg添加protected量CWinThread*MultiThread5Dlg.cpp下操作:定義公共變量:threadInfo雙擊IDC_START,添加相應(yīng)消息處理函數(shù):voidCMultiThread5Dlg::OnStart(){//TODO:Addyourcontrolnotificationhandlercodehere}在函數(shù)BOOLCMultiThread3Dlg::OnInitDialog()中添加語句://TODO:Addextrainitializationherereturn //return unlessyousetthefocustoa}添加線程處理函數(shù):UINTThreadFunc(LPVOID{threadInfo*pInfo=(threadInfo*)lpParam;for(inti=0;i<100;i++){intnTemp=pInfo->nMilliSecond;}return}用MFC類庫編程實(shí)現(xiàn)用戶界面線程1、ClassWizard建類CWinThread(以CUIThread例)classCUIThread:publicCWinThread{ //protectedconstructorusedbydynamiccreat//Attributes//Operations////ClassWizardgeneratedvirtualfunctionvirtualBOOLInitInstance();virtualintExitInstance();//Implementationvirtual//Generatedmessagemap//NOTE-theClassWizardwilladdandremovememberfunctions重載函數(shù)InitInstance(ExitInstance()。BOOL{CFrameWnd*wnd=newwnd->Create(NULL,"UIThreadWindow");returnTRUE;}創(chuàng)建新的用戶界面線程void{CUIThread*pThread=newCUIThread();}請(qǐng)注意以下兩點(diǎn)A、在UIThreadDlg.cpp入語句:#includeB、把UIThread.h類CUIThread()的構(gòu)造函數(shù)的特性由protected改為public用戶界面線程的執(zhí)行次序與應(yīng)用程序主線程相同,首先調(diào)用用戶界面InitInstance()當(dāng)收到WM_QUIT消息后中斷,在消息循環(huán)過,Run()函數(shù)檢測(cè)到線程空閑時(shí)(沒有消息),也將調(diào)用OnIdle()函Run()函數(shù)返回,MFCExitInstance()函數(shù)清理資源。6右擊工選中“NewClass…”為工程添加基類為CWinThread派生線程類CUIThread。給工程添加新框IDD_UITHREADDLG,標(biāo)題為“線程框”。下:voidCUIThreadDlg::OnLButtonDown(UINTnFlags,CPoint{AfxMessageBox("YouClickedTheLeftCDialog::OnLButtonDown(nFlags,}UIThread.h添加#include并在CUIThreadprotectedCUIThreadm_dlgclassCUIThread:publicCWinThread{ //protectedconstructorusedbydynamiccreat//Attributes//Operations////ClassWizardgeneratedvirtualfunctionvirtualBOOLInitInstance();virtualintExitInstance();//ImplementationCUIThreadDlgm_dlg;virtual~CUIThread();//Generatedmessagemap//NOTE-theClassWizardwilladdandremovememberfunctions分別InitInstance()函數(shù)和ExitInstance()函數(shù):BOOL{return}int{return}雙擊IDC_UI_THREAD,添加消息響應(yīng)函數(shù):void{CWinThread}并在MultiThread6Dlg.cpp#include七、線程間通由于屬于同一個(gè)進(jìn)程的各個(gè)線程共享操作系統(tǒng)分配該進(jìn)程的資線程間通信最簡(jiǎn)單的法是使用全局變量。對(duì)于標(biāo)準(zhǔn)類型的全局變量,我們建議使用volatile修飾符,它告訴編譯器無7鈕IDC_RADIO1,IDC_RADIO2,IDC_RADIO3,標(biāo)題分別為1+2+3+4+......+10,1+2+3+4+.MultiThread7Dlg.h定義如下變量:int代表加數(shù)的大小分別雙擊三個(gè)單選按鈕,添加消息響應(yīng)函數(shù):void{}void{}void{}并在OnInitDialog應(yīng)的初始化工作:BOOL{MultiThread7Dlg.h添加:#include"CalculateThread.h"#defineWM_DISPLAYclassCMultiThread7Dlg:public{//ConstructionCMultiThread7Dlg(CWnd*pParent=NULL);//standardconstructorCCalculateThread*m_pCalculateThread;intLRESULTOnDisplay( ram,LPARAMMultiThread7Dlg.cpp加:BEGIN_MESSAGE_MAP(CMultiThread7Dlg,LRESULTCMultiThread7Dlg::OnDisplay( ram,LPARAM{intnTemp=(int)ram;return}以上代碼使得主線程類CMultiThread7Dlg可以處理WM_DISPLAY消息,即在IDC_STATUS框中顯雙擊IDC_SUM,添加消息響應(yīng)函數(shù):void{}右擊工選“NewClass…”為工程添加基類為CWinThread派生線程類CCalculateThread。在文件CalculateThread.h中添加#defineWM_CALCULATEclassCCalculateThread:public{afx_msgLONGOnCalculate(UINTram,LONG在文件CalculateThread.cpp加LONGCCalculateThread::OnCalculate(UINTram,LONG{intfor(inti=0;i<=(int){}return0;}BEGIN_MESSAGE_MAP(CCalculateThread,//NOTE-theClassWizardwilladdandremovemapmacrosCalculateThread.cpp加一條:#include以上代碼為CCalculateThread類添加了WM_CALCULATE消息,消息的是OnCalculate,其功能是根據(jù)參數(shù)ram的值,進(jìn)行累加,累加結(jié)果在臨時(shí)變量nTmpt中,延時(shí)0.5向主線程發(fā)送WM_DISPLAY顯示,nTmpt為參數(shù)傳遞。編譯并運(yùn)行該例程,體會(huì)如何程間傳遞消息八、線程的同 互斥量信號(hào)量A、使用CCriticalSectionCCriticalSection非常簡(jiǎn)單,步驟如下定義CCriticalSection類的一個(gè)全局對(duì)象(以使各個(gè)線程均能),CCriticalSection象:critical_section.Lock();Lock()的線程獲得臨界區(qū);否則,線程將被掛起,并放入到一個(gè)系統(tǒng)隊(duì)列中等待,直到當(dāng)前擁有臨界區(qū)完畢CCriticalSection員函數(shù)Unlock()來釋放臨界區(qū):再通俗一點(diǎn)講A行到critical_section.Lock();語句時(shí),如果其它線程(B)正在執(zhí)行critical_section.Lockcritical_section.Unlock();語句前的語句時(shí),線程A等待,直到線程Bcritical_section.Unlock();語句,線程A執(zhí)行。8建立一個(gè)基于框的工程MultiThread8,在框IDD_MULTITHREAD8_DIALOG中加入兩個(gè)按鈕和兩個(gè)編輯框控件,兩IDIDC_WRITEWIDC_WRITED,標(biāo)題分別為“寫‘W’”和“寫‘D’ID別為IDC_WIDC_D,屬性都選中Read-only;在MultiThread8Dlg.h文件中兩個(gè)線程函數(shù):UINTWriteW(LPVOIDpParam);UINTWriteD(LPVOIDpParam);使用ClassWizardIDC_WIDC_DCEdit變m_ctrlWm_ctrlD;MultiThread8Dlg.cpp下內(nèi)容:為了文件中能夠正確使用同步類,在文件開頭添加:#includeCCriticalSectioncritical_section;charg_Array[10];添加線程函數(shù):UINTWriteW(LPVOID{CEdit*pEdit=(CEdit*)pParam;遇到critical_section.Unlock();語句for(inti=0;i<10;i++){}return0;}UINTWriteD(LPVOID{CEdit*pEdit=(CEdit*)pParam;遇到critical_section.Unlock();語句for(inti=0;i<10;i++){}return0;}分別IDC_WRITEWIDC_WRITED,添加其響應(yīng)函數(shù):voidCMultiThread8Dlg::OnWritew(){CWinThread*pWriteW=AfxBeginThread(WriteW,pWriteW-}void{CWinThread*pWriteD=AfxBeginThread(WriteD,pWriteD-}B、使用CEventCEvent類提供了對(duì)事件的支持。事件是一個(gè)允許一個(gè)線某種情況發(fā)生時(shí),喚醒另外一個(gè)線程的同步對(duì)象。例如在某些網(wǎng)絡(luò)應(yīng)用程序中,一個(gè)線程(記為A)負(fù)責(zé)通訊端口,另外一個(gè)線(記為B)負(fù)責(zé)更新用戶數(shù)據(jù)。通過使用CEventA知線程B時(shí)更新用戶數(shù)據(jù)。每一個(gè)CEvent對(duì)象可以有兩種狀態(tài):有信號(hào)狀態(tài)和無信號(hào)狀態(tài)。線程監(jiān)視位于其中的CEvent類對(duì)MFC,CEvent類對(duì)象有兩種類型:人工事件和自動(dòng)事件。一個(gè)CEvent對(duì)象在被至調(diào)用ReSetEvent()才將其設(shè)置為無信號(hào)狀態(tài)。在創(chuàng)建CEvent類的對(duì)象時(shí),默認(rèn)創(chuàng)建的是自動(dòng)事件。CEvent類的各成員函數(shù)的原型和參數(shù)說明如下:1、CEvent(BOOLBOOLbManualReset=FALSE,LPCTSTRlpszName=NULL,LPSECURITY_ATTRIBUTES后兩個(gè)參數(shù)一般NULL,在此不作過多說明。2、BOOLCEvent::SetEvent();將CEvent類對(duì)象的狀態(tài)設(shè)置為有信號(hào)狀態(tài)。如果事件是人工事件,則CEvent類對(duì)象保持為有成員ResetEvent()將其重新設(shè)為無信號(hào)狀態(tài)時(shí)為止如果CEvent類對(duì)象為自動(dòng)事件,則在SetEvent()將事件設(shè)置為有信號(hào)狀態(tài)后,CEvent類對(duì)象由系統(tǒng)自動(dòng)重置為3、BOOL該函數(shù)將事件的狀態(tài)設(shè)置為無信號(hào)狀態(tài),并保持該狀態(tài)直至SetEvent()被調(diào)用時(shí)為止。由于自返回零我們WaitForSingleObject來監(jiān)視事件狀態(tài)經(jīng)介紹了該函數(shù)。由于語言描述的原因,CEvent類的理解確實(shí)有些難度,但您只要通過仔細(xì)玩味下面例程,多看幾遍9建立一個(gè)基于框的工程MultiThread9,在框IDD_MULTITHREAD9_DIALOG中加入一個(gè)按鈕和兩個(gè)編輯框控件,按IDIDC_WRITEW,標(biāo)題為“寫‘W’IDIDC_WIDC_DRead-only;在MultiThread9Dlg.h文件中兩個(gè)線程函數(shù)UINTWriteW(LPVOIDpParam);UINTWriteD(LPVOID使用ClassWizardIDC_WIDC_DCEdit變m_ctrlWm_ctrlD;MultiThread9Dlg.cpp下內(nèi)容:#includeCEventeventWriteD;charg_Array[10];添加線程函數(shù):UINTWriteW(LPVOID{CEdit*pEdit=(CEdit*)pParam;for(inti=0;i<10;i++){}return0;}UINTWriteD(LPVOID{CEdit*pEdit=(CEdit*)pParam;for(inti=0;i<10;i++){}return}仔細(xì)分析這兩個(gè)線程函數(shù),您就會(huì)正確理解CEvent類。WriteD到WaitForSingleObject(eventWriteD.m_hObject,INFINITE)eventWriteD有系統(tǒng)自動(dòng)把eventWriteD信號(hào)狀態(tài)。雙擊IDC_WRITEW,添加其響應(yīng)函數(shù):void{CWinThread*pWriteW=AfxBeginThread(WriteW,pWriteW-CWinThread*pWriteD=AfxBeginThread(WriteD,pWriteD-}CCMutexDCSemaphore當(dāng)需要一個(gè)計(jì)數(shù)器來限制可以使用某個(gè)可以號(hào)量對(duì)象CSemaphore類的對(duì)象保存了對(duì)當(dāng)前某一指定資源的線程的計(jì)數(shù)值該計(jì)數(shù)值是當(dāng)前還可以使用該資源的線程的數(shù)目。如果這個(gè)計(jì)數(shù)達(dá)到了零,則所有對(duì)這個(gè)CSemaphore類對(duì)象所控制的資源的嘗試都被放計(jì)數(shù)值減1;一個(gè)線程完成了對(duì)被控共享資源的時(shí),計(jì)數(shù)值增1。這個(gè)被CSemaphore類對(duì)象所CSemaphore類的構(gòu)造函數(shù)原型及參數(shù)說明如下CSemaphore(LONGLONGlMaxCount=1,LPCTSTRpstrName=NULL,LPSECURITY_ATTRIBUTESlpsaAttributes=NULL);后兩個(gè)參數(shù)在同一進(jìn)使用一般為NULL,不作過多討論在用CSemaphore類的構(gòu)造函數(shù)創(chuàng)建信號(hào)量對(duì)象時(shí)要同 前可用資源計(jì)數(shù)就會(huì)減1,只要當(dāng)前可用資源計(jì)數(shù)是0以發(fā)出信號(hào)量信號(hào)。但是當(dāng)前可ReleaseSemaphore()函數(shù)將1。下面給出一個(gè)簡(jiǎn)單實(shí)例來說明CSemaphore10建立一個(gè)基于框的工程MultiThread10,在框IDD_MULTITHREAD10_DIALOG中加入一個(gè)按鈕和三個(gè)編輯框控件,按鈕的IDIDC_START,標(biāo)題為“同時(shí)寫‘A’、‘B’、‘C’”;三個(gè)編輯框ID別為IDC_A、IDC_BIDC_C,屬性都選中Read-only;在MultiThread10Dlg.h文件中兩個(gè)線程函數(shù)UINTWriteA(LPVOIDpParam);UINTWriteB(LPVOIDpParam);UINTWriteC(LPVOID使用ClassWizardIDC_AIDC_BIDC_CCEditm_ctrlAm_ctrlBm_ctrlC;MultiThread10Dlg.cpp添加如下內(nèi)容:#includeCSemaphoresemaphoreWrite(2,2);//資源最多線程2個(gè),當(dāng)前可線程數(shù)2個(gè)charg_Array[10];添加三個(gè)線程函UINTWriteA(LPVOID{CEdit*pEdit=(CEdit*)pParam;CStringstr;for(int{}return0;}UINTWriteB(LPVOID{CEditCStringstr;for(int{}return0;}UINTWriteC(LPVOID{CEdit*pEdit=(CEdit*)pParam;for(inti=0;i<10;i++){}return0;}雙擊IDC_START,添加其響應(yīng)函數(shù):void{CWinThread*pWriteA=AfxBeginThread(WriteA,pWriteA-CWinThread*pWriteB=AfxBeginThread(WriteB,pWriteB-CWinThread*pWriteC=AfxBeginThread(WriteC,pWriteC-}VC++中進(jìn)程與多進(jìn)程管理的實(shí)現(xiàn)方1、進(jìn)加載到進(jìn)程地址空間的每一個(gè)可執(zhí)行文件或動(dòng)態(tài)庫文件的映象都會(huì)被分配一個(gè)與之相關(guān)聯(lián)的全局唯一的例句柄Hisace。該例句柄實(shí)是個(gè)記錄有進(jìn)程載位置的本內(nèi)存址。進(jìn)程實(shí)句柄程數(shù)a通第個(gè)參數(shù)HNNCEhnse遞其際值即進(jìn)所使的本地空的址于+程序產(chǎn)生程默認(rèn)基址空間地址為0x ,如沒有必要一般不要修改該。在程序中,可以通過Me2、程的創(chuàng)進(jìn)程的創(chuàng)建通過CreateProcess()函數(shù)來實(shí)現(xiàn),CreateProcess()通過創(chuàng)建一個(gè)新的進(jìn)程及在其地址空間內(nèi)運(yùn)行的主線程來啟動(dòng)并運(yùn)行一個(gè)新的程序。具體的,在執(zhí)行CreateProcess()函數(shù)時(shí),首先由操作系統(tǒng)負(fù)責(zé)創(chuàng)建一個(gè)進(jìn)程內(nèi)核對(duì)象,初始化計(jì)數(shù)為1,并立即為新進(jìn)程創(chuàng)建一塊虛擬地創(chuàng)建主線,也是首先由系統(tǒng)負(fù)責(zé)創(chuàng)建一個(gè)線程內(nèi)核對(duì)象,并初始化為1。最后啟動(dòng)主線執(zhí)行進(jìn)程的函數(shù)WinMain(),完成對(duì)進(jìn)執(zhí)行線程的創(chuàng)建。 BOOLBOOLLPCTSTRlpApplicationName執(zhí)行模塊 mandLine令行字LPSECURITY_ATTRIBUTESlpProcessAttributes程的安全屬性LPSECURITY_ATTRIBUTESlpThreadAttributes,//線程的安全屬性BOOLbInheritHandles,//句柄繼承標(biāo)志DWORDdwCreationFlags建標(biāo)LPVOIDlpEnvironment向新的環(huán)境塊的指LPCTSTRlpCurrentDirectory,//指向當(dāng) 名的指LPSTARTUPINFOlpStartupInfo,//指向啟動(dòng)信LPPROCESS_INFORMATIONlpProcessInformation//指向進(jìn)程信息結(jié)構(gòu)的這將造成比較嚴(yán)重的為保護(hù)地址空間中的內(nèi)容可以考慮將那些需要對(duì)地址空間中的數(shù)據(jù)進(jìn)行訪據(jù)。具體的,可在進(jìn)通過CreateProcess()函數(shù)去創(chuàng)建一個(gè)程,全部處理過 程時(shí)變CStringcharcWindowsDirectory[MAX_PATH];charcCommandLine[MAX_PATH];DWORDdwExitCode;PROCESS_INFORMATIONpi;STARTUPINFOsi=//得到WindowsGetWindowsDirectory(cWindowsDirectory,MAX_PATH);//啟動(dòng)"記事本"程 令sCommandLine=CString(cWindowsDirectory)+::strcpy(cCommandLine,//啟動(dòng)"記事本"作 BOOLret=CreateProcess(NULL,cCommandLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);if(ret){//關(guān) 程的主線程句//等 程的退WaitForSingleObject(pi.hProcess,//獲 程的退出GetExitCodeProcess(pi.hProcess,//關(guān) 程句}WaitForSingleObject()函數(shù)所等待的pi.hProcess對(duì)象將得到通知,父進(jìn)程將得以繼續(xù),必要可以通過GetExitCodeProcess()來獲取程的退出代碼。,相比而言的情況是父進(jìn)啟動(dòng)完程后就再不與其進(jìn)行任何數(shù)據(jù)交換和通訊,由其創(chuàng)能完全通過獨(dú)立的應(yīng)用程序來完成,當(dāng)需要執(zhí)行某操作時(shí)只要通過主程序啟動(dòng)相應(yīng)的程即可,具,對(duì)程句柄pi.hProcess的等待即可: 設(shè) 程的優(yōu)先級(jí)前面的示例代碼在創(chuàng)BOOLret=CreateProcess(NULL,cCommandLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);if(ret){//關(guān) 程的主線程句//關(guān)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論