chap6-多線程編程技術(shù)_第1頁
chap6-多線程編程技術(shù)_第2頁
chap6-多線程編程技術(shù)_第3頁
chap6-多線程編程技術(shù)_第4頁
chap6-多線程編程技術(shù)_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

計算機控制工程計算機控制工程第六章多線程編程技術(shù)線程間通信3多線程概述1線程的操作2

線程同步4實例-多線程實現(xiàn)計算機間通信5小結(jié)6計算機控制工程Windows是一種多任務(wù)的操作系統(tǒng)。Windows中一個進程包含一個或多個線程。第六章多線程編程Windows多線程編程方式:1、Win32API;2、標準C庫;3、MFC類庫;目的:提高程序執(zhí)行效率;提高用戶體驗;計算機控制工程第一節(jié)多線程概述多線程概念一多線程指在同一程序中同時執(zhí)行多個任務(wù)或多個程序。這意味著用戶可以將整個任務(wù)分成幾個線程,然后讓操作系統(tǒng)同時執(zhí)行。注意:雖然在微觀上仍然是分時的,但這種調(diào)度策略確實能夠提高CPU的利用率,從而提高程序的執(zhí)行效率。關(guān)鍵是理解線程與進程的概念。計算機控制工程第一節(jié)多線程概述Aprocesswithtwothreadsofexecution

onasingleprocessor.計算機控制工程第一節(jié)多線程概述1.進程進程是一個程序?qū)嵗?;進程占據(jù)4GB地址空間,在該空間存放應(yīng)用程序

執(zhí)行所需要的各種資源;

Win32進程沒有活力,是靜態(tài)的。

2.線程線程是CPU調(diào)度計算任務(wù)的最小單位;

Win32進程創(chuàng)建時,會自動創(chuàng)建一個主線程;主線程可以創(chuàng)建其它線程(輔助線程)計算機控制工程第一節(jié)多線程概述第一節(jié)多線程概述應(yīng)用場合二總體上來講,進程占用資源比線程多得多。實際上線程只有一個內(nèi)核對象和一個堆棧。開發(fā)人員應(yīng)設(shè)法增加線程在解決編程問題。避免創(chuàng)建新的線程。場合一:耗時操作可單獨為其開辟一個線程,因為在主線程中執(zhí)行這些操作會讓用戶體驗差。場合二:針對用戶界面。線程可分為用戶接口線程和工作者線程。用戶接口線程不應(yīng)該執(zhí)行時長100ms以上的工作;工作者線程不應(yīng)該處理用戶界面。工作線程不具備消息循環(huán)計算機控制工程第二節(jié)線程的操作創(chuàng)建線程一線程創(chuàng)建步驟:編寫線程函數(shù)(無特殊要求);創(chuàng)建線程。1.AfxBeginThread()函數(shù)(MFC)

MFC支持兩種線程類型:工作者線程和用戶接口線程計算機控制工程第二節(jié)線程的操作工作者線程:CWinThread*AfxBeginThread( AFX_THREADPROCpfnThreadProc, LPVOIDpParam, intnPriority=THREAD_PRIORITY_NORMAL, UINTnStackSize=0, DWORDdwCreateFlags=0, LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL);UINT__cdeclThreadFunction(LPVOIDpParam)

計算機控制工程第二節(jié)線程的操作用戶接口線程:CWinThread*AfxBeginThread( CRuntimeClass*pThreadClass, intnPriority=THREAD_PRIORITY_NORMAL, UINTnStackSize=0, DWORDdwCreateFlags=0, LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL);TheRUNTIME_CLASSofanobjectderivedfromCWinThread.計算機控制工程第二節(jié)線程的操作2.CreateThread()函數(shù)(Win32API)計算機控制工程第二節(jié)線程的操作3._beginthreadex()函數(shù)(C運行庫)__cdecl調(diào)用協(xié)議__stdcall調(diào)用協(xié)議計算機控制工程第二節(jié)線程的操作終止線程二終止線程有三種方法:線程函數(shù)自然退出;使用退出函數(shù);使用TerminateThread()函數(shù)。1.線程函數(shù)自然退出在線程函數(shù)內(nèi)部設(shè)置某種條件,當該條件滿足時,就不斷執(zhí)行該線程函數(shù)體;當條件不滿足時,就退出線程函數(shù)體。當線程函數(shù)退出時,將使系統(tǒng)自動清除該線程所占用資源,然后正常退出。計算機控制工程第二節(jié)線程的操作2.使用退出函數(shù)在線程運行期間必須終止線程。此時只能在線程函數(shù)體內(nèi)使用退出線程的函數(shù)。使用退出函數(shù),可以保證資源能夠正確釋放。AfxBeginThread() voidAfxEndThread(UINTnExitCode)CreateThread() voidExitThread(DWORDdwExitCode)_beginthread() void_endthread(void);計算機控制工程第二節(jié)線程的操作3.使用TerminateThread()函數(shù)在線程函數(shù)外部將線程終止。 BOOLTerminateThread(){ HANDLEhThread; DWORDdwExitCode; }計算機控制工程第二節(jié)線程的操作內(nèi)存泄漏三合理的使用C運行庫、WinAPI以及MFC創(chuàng)建的終止線程。計算機控制工程第三節(jié)線程間通信使用全局變量一同一進程創(chuàng)建的各個線程間通常需要進行數(shù)據(jù)交換。常用的數(shù)據(jù)交換方法是使用全局變量;另外,各線程之間可能要交換一些狀態(tài),可考慮使用消息。最簡單的方法是使用全局變量;僅僅需要在實現(xiàn)文件頂部申明就可直接使用。缺點:???破壞結(jié)構(gòu)化程序設(shè)計。計算機控制工程第三節(jié)線程間通信使用自定義消息二通常創(chuàng)建工作者線程執(zhí)行某個特定的計算任務(wù)。在該線程中對于某些操作狀態(tài)必須及時通知主線程,以便主線程進行一定的處理(如更新界面的參數(shù))。顯然采用全局變量不能滿足要求。解決方式:考慮使用用戶自定義消息,通過在消息參數(shù)中指定消息的內(nèi)容,將消息郵寄到程序消息隊列中。主程序一旦收到該消息后,根據(jù)消息的內(nèi)容,可以及時處理線程的請求。計算機控制工程第三節(jié)線程間通信步驟:1.聲明自定義消息:在頭文件頂部加入消息名稱聲明:

constWM_THREADMSG=WM_USER+100;2.聲明消息響應(yīng)函數(shù):在頭文件//}}AFX_MSG和“DECLARE_MESSAGE_MAP()”之間聲明消息響應(yīng)函數(shù):

Afx_msgLONGOnThreadMsg(WPARAMwParam,

LPARAM,lParam)3.建立消息連接:在實現(xiàn)文件//}}AFX_MSG_MAP和

“END_MESSAGE_MAP()”之間:

ON_MESSAGE(WM_THREADMSG,OnThreadMsg)計算機控制工程第三節(jié)線程間通信4.編寫消息響應(yīng)函數(shù):在實現(xiàn)文件中,添加消息函數(shù)函數(shù)的實現(xiàn)體:

LONGCMyClass::OnThreadMsg(WPARAMwParam, LPARAMlParam){ //加入響應(yīng)函數(shù)的具體處理代碼 }5.寄送自定義消息:BOOLPostMessage(HWNDhWnd,UINTMsg,

WPARAMwParam,LPARAMlParam);計算機控制工程第四節(jié)線程同步多線程引入了新問題:線程之間經(jīng)常需要同時訪問一些資源,因此共享資源進行訪問引起沖突是不可避免的。解決方法:線程同步;Win32API解決方案:

臨界區(qū) (CriticalSection)

互斥對象 (Mutex)

信號量 (Semaphore)

事件 (Event)計算機控制工程第四節(jié)線程同步使用臨界區(qū)一Acriticalsectionobjectprovidessynchronizationsimilartothatprovidedbyamutexobject,exceptthatacriticalsectioncanbeusedonlybythethreadsofasingleprocess.Event,mutex,andsemaphoreobjectscanalsobeusedinasingle-processapplication,butcriticalsectionobjectsprovideaslightlyfaster,moreefficientmechanismformutual-exclusionsynchronization(aprocessor-specifictestandsetinstruction).Likeamutexobject,acriticalsectionobjectcanbeownedbyonlyonethreadatatime,whichmakesitusefulforprotectingasharedresourcefromsimultaneousaccess.計算機控制工程第四節(jié)線程同步1.聲明CRITICAL_SECTION對象(頭文件中)

CRITICAL_SECTION cs;2.初始化CRITICAL_SECTION對象(實現(xiàn)文件中,如可

以在OnCreate()中初始化)

InitializeCriticalSection(&cs);3.進入臨界區(qū):在線程函數(shù)中,在訪問共享資源之前加入:

EnterCriticalSection(&cs);4.離開臨界區(qū):共享資源操作完成后,調(diào)用下述函數(shù):

LeaveCriticalSection(&cs);檢查臨界區(qū)是否被占用,若占用則停止在此處,直至臨界區(qū)釋放;若未占用,則繼續(xù)執(zhí)行釋放臨界區(qū)的占用,為其它程序訪問共享資源提供機會。計算機控制工程第四節(jié)線程同步使用互斥對象二A

mutexobject

isasynchronizationobjectwhosestateissettosignaledwhenitisnotownedbyanythread,andnonsignaledwhenitisowned.Onlyonethreadatatimecanownamutexobject,whosenamecomesfromthefactthatitisusefulincoordinatingmutuallyexclusiveaccesstoasharedresource.Forexample,topreventtwothreadsfromwritingtosharedmemoryatthesametime,eachthreadwaitsforownershipofamutexobjectbeforeexecutingthecodethataccessesthememory.Afterwritingtothesharedmemory,thethreadreleasesthemutexobject.

計算機控制工程第四節(jié)線程同步1.聲明互斥對象(頭文件中)

HANDLE hMutex;2.建立并初始化互斥對象(如在OnCreate()中初始化)hMutex=CreateMutex(NULL,FALSE,NULL);3.等待互斥對象:線程函數(shù)中,在訪問共享資源之前加入:WaitForSingleObject(hMutex,INFINITE);4.釋放互斥對象:共享資源操作完成后,調(diào)用下述函數(shù):ReleaseMutex(hMutex);檢查互斥對象是否被占用,若占用則停止在此處,直至互斥對象釋放;若未占用,則繼續(xù)執(zhí)行釋放互斥對象的占用,為其它程序訪問共享資源提供機會。計算機控制工程第四節(jié)線程同步使用信號量三Asemaphoreobjectisasynchronizationobjectthatmaintainsacountbetweenzeroandaspecifiedmaximumvalue.Thecountisdecrementedeachtimeathreadcompletesawaitforthesemaphoreobjectandincrementedeachtimeathreadreleasesthesemaphore.Whenthecountreacheszero,nomorethreadscansuccessfullywaitforthesemaphoreobjectstatetobecomesignaled.Thestateofasemaphoreissettosignaledwhenitscountisgreaterthanzero,andnonsignaledwhenitscountiszero.計算機控制工程第四節(jié)線程同步1.聲明信號量對象(頭文件中)

HANDLE hSemaphore;2.建立并初始化信號量(如在OnCreate()中初始化)hMutex=CreateSemaphore(NULL,3,5,NULL);3.等待互信號量:線程函數(shù)中,在訪問共享資源之前加入:WaitForSingleObject(hSemaphore,INFINITE);4.釋放信號量:共享資源操作完成后,調(diào)用下述函數(shù):ReleaseSemaphore(hSemaphore,1,NULL);檢查信號量計數(shù)是否大于0.若不大于0,則程序停在此處,直至計數(shù)值大于0;若大于0則將計數(shù)值減1,然后繼續(xù)執(zhí)行增加信號量計數(shù)值,為其它程序訪問共享資源提供機會。計算機控制工程第四節(jié)線程同步使用事件四AneventobjectisasynchronizationobjectwhosestatecanbeexplicitlysettosignaledbyuseoftheSetEventfunction.Theeventobjectisusefulinsendingasignaltoathreadindicatingthataparticulareventhasoccurred.Forexample,inoverlappedinputandoutput,thesystemsetsaspecifiedeventobjecttothesignaledstatewhentheoverlappedoperationhasbeencompleted.Asinglethreadcanspecifydifferenteventobjectsinseveralsimultaneousoverlappedoperations,thenuseoneofthemultiple-objectwaitfunctionstowaitforthestateofanyoneoftheeventobjectstobesignaled.計算機控制工程第四節(jié)線程同步1.聲明事件對象(頭文件中)

HANDLE hEvent;2.建立并初始化事件(如在OnCreate()中初始化)hEvent=CreateEvent(NULL,FALSE,TRUE,NULL);3.等待事件對象:線程函數(shù)中,在訪問共享資源之前加入:WaitForSingleObject(hEvent,INFINITE);4.設(shè)置事件為有信號狀態(tài):共享資源操作完成后,調(diào)用下述函數(shù):SetEvent(hEvent);檢查事件對象是否有信號。若無信號則程序停在此處,直至有信號;若有信號,則繼續(xù)執(zhí)行。第2參數(shù):自動復(fù)位;第3參數(shù):初始化為有信號狀態(tài)計算機控制工程第四節(jié)線程同步各種方法比較五一個簡單的規(guī)則:如果某個操作必須等待另一個操作完成,則考慮使用事件對象;同一時刻,同一個應(yīng)用程序指定個數(shù)線程要訪問同一資源,則使用信號量;同時訪問同一個資源的應(yīng)用程序多于1個,應(yīng)該使用互斥對象;否則使用臨界區(qū)。計算機控制工程第五節(jié)多線程兩臺計算機串口通信程序以串口程序設(shè)計為例說明:使用WinAPI編寫串口程序時,為實現(xiàn)事件驅(qū)動方式,可以考慮單獨建立一個線程,在該線程中循環(huán)檢測串口事件,當串口發(fā)生感興趣事件時,就發(fā)送消息,通知其它線程到串口讀取數(shù)據(jù)。當使用多個串口時,使用多線程為每個串口開辟一個線程,處理各個串口的數(shù)據(jù)接收。當有接受數(shù)據(jù)時,通過某種方式傳輸給主線程進行顯示和處理。計算機控制工程多線程應(yīng)用框架一以兩臺計算機間通信的程序為例多線程編程的具體方法?!?ON_MESSAGE(WM_MYMSG,OnReceiveEvent)………….hThreadEvent=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProcEvent,&dwParam,0,&dwThreadID);……DWORDThreadProEvent(LPVOIDpParam){//…//滿足某種條件時;::PostMessage(hWnd, WM_MYMSG, 0, (LPARAM)EV_RXCHAR);…….}LONGCPC2PCView::OnReceiveEvent(…){ …… //讀取串口操作 ……}第五節(jié)多線程兩臺計算機串口通信程序計算機控制工程兩臺計算機之間通信方式二第五節(jié)多線程兩臺計算機串口通信程序1.通過網(wǎng)線傳輸2.通過USB線傳輸3.通過并口傳輸(SPP、ECP)4.通過串口傳輸(2RxD、3TxD號線對調(diào))計算機控制工程第五節(jié)多線程兩臺計算機串口通信程序通信協(xié)議三1.通信流程通信采用發(fā)送/應(yīng)答半雙工方式。通信過程分為:發(fā)送請求和發(fā)送文件兩個過程。發(fā)送請求:發(fā)送方首先發(fā)出請求包,并等待應(yīng)答方響應(yīng)。若收到應(yīng)答方ACK(6)響應(yīng),發(fā)送數(shù)據(jù)包;若收到應(yīng)答方NAK(21)響應(yīng),重發(fā)請求包;若收到應(yīng)答方CAN(24)響應(yīng),取消本次發(fā)送請求;計算機控制工程第五節(jié)多線程兩臺計算機串口通信程序發(fā)送文件:發(fā)送方將待發(fā)送的文件以1024字節(jié)為單位拆分成N個數(shù)據(jù)片段,最后一個數(shù)據(jù)片段長度不定。每次使用普通數(shù)據(jù)包發(fā)送一個數(shù)據(jù)片段,若接受方接受正確,會發(fā)送一個ACK響應(yīng),發(fā)送方在收到正確的響應(yīng)后,繼續(xù)發(fā)送含有下一個數(shù)據(jù)片段的普通數(shù)據(jù)包;若發(fā)送方收到NAK響應(yīng),則重發(fā)上一次發(fā)送的普通數(shù)據(jù)包。這個發(fā)送過程需要循環(huán)N-1次。當發(fā)送方發(fā)送到第N個數(shù)據(jù)片段時,使用結(jié)束包格式進行發(fā)送,若接受方正確響應(yīng)ACK,則通信正常結(jié)束;若接受方響應(yīng)NAK,則發(fā)送方重發(fā)含有第N個數(shù)據(jù)片段的接受包計算機控制工程第五節(jié)多線程兩臺計算機串口通信程序重要說明:發(fā)送方對于同一個數(shù)據(jù)包的重發(fā)操作,設(shè)定最多進行3次。3次后,發(fā)送方若仍接受不到ACK響應(yīng),則中斷文件傳輸操作,并提示通信錯誤。思考:

如用4個字節(jié)表示文件長度;則文件最大長度是多少?給定合法長度文件,如何填裝4個字節(jié);計算機控制工程第五節(jié)多線程兩臺計算機串口通信程序數(shù)據(jù)包格式四1.請求包長度由文件名長度決定從ENG開始到其前面所有字節(jié)的異或運算和2.普通數(shù)據(jù)包計算機控制工程3.結(jié)束包第五節(jié)多線程兩臺計算機串口通信程序4.響應(yīng)包:長度固定為1個字節(jié)。計算機控制工程第五節(jié)多線程兩臺計算機串口通信程序通信實現(xiàn)思路五通信程序使用WindowsAPI事件驅(qū)動方式、多線程技術(shù)。在程序中,為通信的事件檢測設(shè)立一個單獨的事件線程,該線程負責監(jiān)視串口事件。當串口收到字符或發(fā)生讀超時時,該線程便發(fā)送相應(yīng)消息。通信消息響應(yīng)函數(shù)捕獲事件線程發(fā)送的消息,并根據(jù)消息類型進行處理。所有消息公用一個消息響應(yīng)函數(shù),故設(shè)置3個反映當前通信狀態(tài)的變量,進入消息響應(yīng)函數(shù)后,通過對這些通信狀態(tài)變量值的不同采取不同的操作。計算機控制工程第五節(jié)多線程兩臺計算機串口通信程序1.功能描述雙機通信程序。既可作為發(fā)送方使,也可作為接受方使用。程序運行后,自動進入接受態(tài)。2.事件線程函數(shù)

為處理通信事件,專門建立一個事件線程。在該事件線程函數(shù)中,監(jiān)視串口事件的當前消息,包括是否收到新字符和是否發(fā)送超時。當收到新字符或發(fā)生超時,便發(fā)送Windows消息。計算機控制工程第五節(jié)多線程兩臺計算機串口通信程序事件線程函數(shù)處理流程圖計算機控制工程3.消息響應(yīng)函數(shù)第五節(jié)多線程兩臺計算機串口通信程序既可作為發(fā)送又可作為接受程序:1:發(fā)送狀態(tài);10:接受狀態(tài)0態(tài):表示發(fā)送操作尚未開始,程序處于接受狀態(tài)。程序初次啟動或完成一次傳送后處于該狀態(tài)。1態(tài):表示發(fā)送操作已經(jīng)開始,請求包已經(jīng)發(fā)出,等待接受方響應(yīng)。若接受方響應(yīng)NAK,則重發(fā)請求包;若接受方響應(yīng)ACK,則發(fā)送方判斷文件長度,若文件長度大于1024字節(jié),則發(fā)送第一個普通數(shù)據(jù)包,然后將發(fā)送操作置為2態(tài),否則發(fā)送結(jié)束數(shù)據(jù)包,然后將發(fā)送狀態(tài)置為3態(tài)。2態(tài):表示發(fā)送操作已經(jīng)開始,并且第一個普通包已經(jīng)發(fā)出,等待接受方響應(yīng)。若響應(yīng)NAK:重發(fā);狀態(tài)不變?nèi)繇憫?yīng)CAN:取消;若響應(yīng)ACK:計算剩余部分長度,如大于1024字節(jié),則繼續(xù)發(fā)送普通數(shù)據(jù)包,狀態(tài)不變,否則發(fā)送結(jié)束數(shù)

溫馨提示

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

評論

0/150

提交評論