多線程編程總結(jié)

多線程編程總結(jié)

ID:41037455

大?。?1.00 KB

頁數(shù):6頁

時間:2019-08-14

多線程編程總結(jié)_第1頁
多線程編程總結(jié)_第2頁
多線程編程總結(jié)_第3頁
多線程編程總結(jié)_第4頁
多線程編程總結(jié)_第5頁
資源描述:

《多線程編程總結(jié)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、多線程編程總結(jié)(一)MFC多線程? ??????????MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程。二者的主要區(qū)別在于工作者線程沒有消息循環(huán),而用戶界面線程有自己的消息隊列和消息循環(huán)?! ??????工作者線程沒有消息機制,通常用來執(zhí)行后臺計算和維護任務(wù),如冗長的計算過程,打印機的后臺打印等。用戶界面線程一般用于處理獨立于其他線程執(zhí)行之外的用戶輸入,響應(yīng)用戶及系統(tǒng)所產(chǎn)生的事件和消息等。但對于Win32的API編程而言,這兩種線程是沒有區(qū)別的,它們都只需線程的啟動地址即可啟動線程來執(zhí)行任務(wù)?!???在MFC中,一般用全局函數(shù)AfxBeginThr

2、ead()來創(chuàng)建并初始化一個線程的運行,該函數(shù)有兩種重載形式,分別用于創(chuàng)建工作者線程和用戶界面線程。兩種重載函數(shù)原型和參數(shù)分別說明如下:(1)CWinThread*AfxBeginThread(AFX_THREADPROCpfnThreadProc,LPVOIDpParam,nPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL);PfnThreadProc:指向工作者線程的執(zhí)行函數(shù)的指針

3、,線程函數(shù)原型必須聲明如下:UINTExecutingFunction(LPVOIDpParam);??????請注意,ExecutingFunction()應(yīng)返回一個UINT類型的值,用以指明該函數(shù)結(jié)束的原因。一般情況下,返回0表明執(zhí)行成功?!Param:傳遞給線程函數(shù)的一個32位參數(shù),執(zhí)行函數(shù)將用某種方式解釋該值。它可以是數(shù)值,或是指向一個結(jié)構(gòu)的指針,甚至可以被忽略;·nPriority:線程的優(yōu)先級。如果為0,則線程與其父線程具有相同的優(yōu)先級;·nStackSize:線程為自己分配堆棧的大小,其單位為字節(jié)。如果nStackSize被設(shè)為0,則線程的

4、堆棧被設(shè)置成與父線程堆棧相同大??;·dwCreateFlags:如果為0,則線程在創(chuàng)建后立刻開始執(zhí)行。如果為CREATE_SUSPEND,則線程在創(chuàng)建后立刻被掛起;·lpSecurityAttrs:線程的安全屬性指針,一般為NULL;(2)CWinThread*AfxBeginThread(CRuntimeClass*pThreadClass,intnPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAtt

5、rs=NULL);pThreadClass是指向CWinThread的一個導出類的運行時類對象的指針,該導出類定義了被創(chuàng)建的用戶界面線程的啟動、退出等;其它參數(shù)的意義同形式1。使用函數(shù)的這個原型生成的線程也有消息機制,此消息機制同主線程的機制幾乎一樣。??????在工作線程中使用的函數(shù)指針一般是指向全局函數(shù)的而不是類成員函數(shù),因為這牽扯到對象的生命周期,如果一個對象在線程執(zhí)行時被銷毀了,那么這個線程的行為就成為不確定的了。(二)線程間通訊  一般而言,應(yīng)用程序中的一個次要線程總是為主線程執(zhí)行特定的任務(wù),這樣,主線程和次要線程間必定有一個信息傳遞的渠道,也就

6、是主線程和次要線程間要進行通信。這種線程間的通信不但是難以避免的,而且在多線程編程中也是復(fù)雜和頻繁的,下面將進行說明。1.使用全局變量進行通信由于屬于同一個進程的各個線程共享操作系統(tǒng)分配該進程的資源,故解決線程間通信最簡單的一種方法是使用全局變量。對于標準類型的全局變量,建議使用volatile修飾符,它告訴編譯器無需對該變量作任何的優(yōu)化,即無需將它放到一個寄存器中,并且該值可被外部改變。如果線程間所需傳遞的信息較復(fù)雜,我們可以定義一個結(jié)構(gòu),通過傳遞指向該結(jié)構(gòu)的指針進行傳遞信息。2.使用自定義消息我們可以在一個線程的執(zhí)行函數(shù)中向另一個線程發(fā)送自定義的消息來

7、達到通信的目的。一個線程向另外一個線程發(fā)送消息是通過操作系統(tǒng)實現(xiàn)的。利用Windows操作系統(tǒng)的消息驅(qū)動機制,當一個線程發(fā)出一條消息時,操作系統(tǒng)首先接收到該消息,然后把該消息轉(zhuǎn)發(fā)給目標線程,接收消息的線程必須已經(jīng)建立了消息循環(huán)。??????????例如,我們想增加一個用戶自定義消息WM_USER_THREADEND其方法是:??????????1.?在頭文件stdafx.h中增加一個自定義消息宏????????????????????????#defineWM_USER_THREADENDWM_USER+1??????????2.?在于增加新消息的窗口或?qū)?/p>

8、話框類的頭文件中增加一個回調(diào)函數(shù)聲明,注意要聲明為public??

當前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。