




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
計算機控制工程計算機控制工程第六章多線程編程技術線程間通信3多線程概述1線程的操作2
線程同步4實例-多線程實現計算機間通信5小結6計算機控制工程Windows是一種多任務的操作系統。Windows中一個進程包含一個或多個線程。第六章多線程編程Windows多線程編程方式:1、Win32API;2、標準C庫;3、MFC類庫;目的:提高程序執行效率;提高用戶體驗;計算機控制工程第一節多線程概述多線程概念一多線程指在同一程序中同時執行多個任務或多個程序。這意味著用戶可以將整個任務分成幾個線程,然后讓操作系統同時執行。注意:雖然在微觀上仍然是分時的,但這種調度策略確實能夠提高CPU的利用率,從而提高程序的執行效率。關鍵是理解線程與進程的概念。計算機控制工程第一節多線程概述Aprocesswithtwothreadsofexecution
onasingleprocessor.計算機控制工程第一節多線程概述1.進程進程是一個程序實例;進程占據4GB地址空間,在該空間存放應用程序
執行所需要的各種資源;
Win32進程沒有活力,是靜態的。
2.線程線程是CPU調度計算任務的最小單位;
Win32進程創建時,會自動創建一個主線程;主線程可以創建其它線程(輔助線程)計算機控制工程第一節多線程概述第一節多線程概述應用場合二總體上來講,進程占用資源比線程多得多。實際上線程只有一個內核對象和一個堆棧。開發人員應設法增加線程在解決編程問題。避免創建新的線程。場合一:耗時操作可單獨為其開辟一個線程,因為在主線程中執行這些操作會讓用戶體驗差。場合二:針對用戶界面。線程可分為用戶接口線程和工作者線程。用戶接口線程不應該執行時長100ms以上的工作;工作者線程不應該處理用戶界面。工作線程不具備消息循環計算機控制工程第二節線程的操作創建線程一線程創建步驟:編寫線程函數(無特殊要求);創建線程。1.AfxBeginThread()函數(MFC)
MFC支持兩種線程類型:工作者線程和用戶接口線程計算機控制工程第二節線程的操作工作者線程:CWinThread*AfxBeginThread( AFX_THREADPROCpfnThreadProc, LPVOIDpParam, intnPriority=THREAD_PRIORITY_NORMAL, UINTnStackSize=0, DWORDdwCreateFlags=0, LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL);UINT__cdeclThreadFunction(LPVOIDpParam)
計算機控制工程第二節線程的操作用戶接口線程:CWinThread*AfxBeginThread( CRuntimeClass*pThreadClass, intnPriority=THREAD_PRIORITY_NORMAL, UINTnStackSize=0, DWORDdwCreateFlags=0, LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL);TheRUNTIME_CLASSofanobjectderivedfromCWinThread.計算機控制工程第二節線程的操作2.CreateThread()函數(Win32API)計算機控制工程第二節線程的操作3._beginthreadex()函數(C運行庫)__cdecl調用協議__stdcall調用協議計算機控制工程第二節線程的操作終止線程二終止線程有三種方法:線程函數自然退出;使用退出函數;使用TerminateThread()函數。1.線程函數自然退出在線程函數內部設置某種條件,當該條件滿足時,就不斷執行該線程函數體;當條件不滿足時,就退出線程函數體。當線程函數退出時,將使系統自動清除該線程所占用資源,然后正常退出。計算機控制工程第二節線程的操作2.使用退出函數在線程運行期間必須終止線程。此時只能在線程函數體內使用退出線程的函數。使用退出函數,可以保證資源能夠正確釋放。AfxBeginThread() voidAfxEndThread(UINTnExitCode)CreateThread() voidExitThread(DWORDdwExitCode)_beginthread() void_endthread(void);計算機控制工程第二節線程的操作3.使用TerminateThread()函數在線程函數外部將線程終止。 BOOLTerminateThread(){ HANDLEhThread; DWORDdwExitCode; }計算機控制工程第二節線程的操作內存泄漏三合理的使用C運行庫、WinAPI以及MFC創建的終止線程。計算機控制工程第三節線程間通信使用全局變量一同一進程創建的各個線程間通常需要進行數據交換。常用的數據交換方法是使用全局變量;另外,各線程之間可能要交換一些狀態,可考慮使用消息。最簡單的方法是使用全局變量;僅僅需要在實現文件頂部申明就可直接使用。缺點:???破壞結構化程序設計。計算機控制工程第三節線程間通信使用自定義消息二通常創建工作者線程執行某個特定的計算任務。在該線程中對于某些操作狀態必須及時通知主線程,以便主線程進行一定的處理(如更新界面的參數)。顯然采用全局變量不能滿足要求。解決方式:考慮使用用戶自定義消息,通過在消息參數中指定消息的內容,將消息郵寄到程序消息隊列中。主程序一旦收到該消息后,根據消息的內容,可以及時處理線程的請求。計算機控制工程第三節線程間通信步驟:1.聲明自定義消息:在頭文件頂部加入消息名稱聲明:
constWM_THREADMSG=WM_USER+100;2.聲明消息響應函數:在頭文件//}}AFX_MSG和“DECLARE_MESSAGE_MAP()”之間聲明消息響應函數:
Afx_msgLONGOnThreadMsg(WPARAMwParam,
LPARAM,lParam)3.建立消息連接:在實現文件//}}AFX_MSG_MAP和
“END_MESSAGE_MAP()”之間:
ON_MESSAGE(WM_THREADMSG,OnThreadMsg)計算機控制工程第三節線程間通信4.編寫消息響應函數:在實現文件中,添加消息函數函數的實現體:
LONGCMyClass::OnThreadMsg(WPARAMwParam, LPARAMlParam){ //加入響應函數的具體處理代碼 }5.寄送自定義消息:BOOLPostMessage(HWNDhWnd,UINTMsg,
WPARAMwParam,LPARAMlParam);計算機控制工程第四節線程同步多線程引入了新問題:線程之間經常需要同時訪問一些資源,因此共享資源進行訪問引起沖突是不可避免的。解決方法:線程同步;Win32API解決方案:
臨界區 (CriticalSection)
互斥對象 (Mutex)
信號量 (Semaphore)
事件 (Event)計算機控制工程第四節線程同步使用臨界區一Acriticalsectionobjectprovidessynchronizationsimilartothatprovidedbyamutexobject,exceptthatacriticalsectioncanbeusedonlybythethreadsofasingleprocess.Event,mutex,andsemaphoreobjectscanalsobeusedinasingle-processapplication,butcriticalsectionobjectsprovideaslightlyfaster,moreefficientmechanismformutual-exclusionsynchronization(aprocessor-specifictestandsetinstruction).Likeamutexobject,acriticalsectionobjectcanbeownedbyonlyonethreadatatime,whichmakesitusefulforprotectingasharedresourcefromsimultaneousaccess.計算機控制工程第四節線程同步1.聲明CRITICAL_SECTION對象(頭文件中)
CRITICAL_SECTION cs;2.初始化CRITICAL_SECTION對象(實現文件中,如可
以在OnCreate()中初始化)
InitializeCriticalSection(&cs);3.進入臨界區:在線程函數中,在訪問共享資源之前加入:
EnterCriticalSection(&cs);4.離開臨界區:共享資源操作完成后,調用下述函數:
LeaveCriticalSection(&cs);檢查臨界區是否被占用,若占用則停止在此處,直至臨界區釋放;若未占用,則繼續執行釋放臨界區的占用,為其它程序訪問共享資源提供機會。計算機控制工程第四節線程同步使用互斥對象二A
mutexobject
isasynchronizationobjectwhosestateissettosignaledwhenitisnotownedbyanythread,andnonsignaledwhenitisowned.Onlyonethreadatatimecanownamutexobject,whosenamecomesfromthefactthatitisusefulincoordinatingmutuallyexclusiveaccesstoasharedresource.Forexample,topreventtwothreadsfromwritingtosharedmemoryatthesametime,eachthreadwaitsforownershipofamutexobjectbeforeexecutingthecodethataccessesthememory.Afterwritingtothesharedmemory,thethreadreleasesthemutexobject.
計算機控制工程第四節線程同步1.聲明互斥對象(頭文件中)
HANDLE hMutex;2.建立并初始化互斥對象(如在OnCreate()中初始化)hMutex=CreateMutex(NULL,FALSE,NULL);3.等待互斥對象:線程函數中,在訪問共享資源之前加入:WaitForSingleObject(hMutex,INFINITE);4.釋放互斥對象:共享資源操作完成后,調用下述函數:ReleaseMutex(hMutex);檢查互斥對象是否被占用,若占用則停止在此處,直至互斥對象釋放;若未占用,則繼續執行釋放互斥對象的占用,為其它程序訪問共享資源提供機會。計算機控制工程第四節線程同步使用信號量三Asemaphoreobjectisasynchronizationobjectthatmaintainsacountbetweenzeroandaspecifiedmaximumvalue.Thecountisdecrementedeachtimeathreadcompletesawaitforthesemaphoreobjectandincrementedeachtimeathreadreleasesthesemaphore.Whenthecountreacheszero,nomorethreadscansuccessfullywaitforthesemaphoreobjectstatetobecomesignaled.Thestateofasemaphoreissettosignaledwhenitscountisgreaterthanzero,andnonsignaledwhenitscountiszero.計算機控制工程第四節線程同步1.聲明信號量對象(頭文件中)
HANDLE hSemaphore;2.建立并初始化信號量(如在OnCreate()中初始化)hMutex=CreateSemaphore(NULL,3,5,NULL);3.等待互信號量:線程函數中,在訪問共享資源之前加入:WaitForSingleObject(hSemaphore,INFINITE);4.釋放信號量:共享資源操作完成后,調用下述函數:ReleaseSemaphore(hSemaphore,1,NULL);檢查信號量計數是否大于0.若不大于0,則程序停在此處,直至計數值大于0;若大于0則將計數值減1,然后繼續執行增加信號量計數值,為其它程序訪問共享資源提供機會。計算機控制工程第四節線程同步使用事件四AneventobjectisasynchronizationobjectwhosestatecanbeexplicitlysettosignaledbyuseoftheSetEventfunction.Theeventobjectisusefulinsendingasignaltoathreadindicatingthataparticulareventhasoccurred.Forexample,inoverlappedinputandoutput,thesystemsetsaspecifiedeventobjecttothesignaledstatewhentheoverlappedoperationhasbeencompleted.Asinglethreadcanspecifydifferenteventobjectsinseveralsimultaneousoverlappedoperations,thenuseoneofthemultiple-objectwaitfunctionstowaitforthestateofanyoneoftheeventobjectstobesignaled.計算機控制工程第四節線程同步1.聲明事件對象(頭文件中)
HANDLE hEvent;2.建立并初始化事件(如在OnCreate()中初始化)hEvent=CreateEvent(NULL,FALSE,TRUE,NULL);3.等待事件對象:線程函數中,在訪問共享資源之前加入:WaitForSingleObject(hEvent,INFINITE);4.設置事件為有信號狀態:共享資源操作完成后,調用下述函數:SetEvent(hEvent);檢查事件對象是否有信號。若無信號則程序停在此處,直至有信號;若有信號,則繼續執行。第2參數:自動復位;第3參數:初始化為有信號狀態計算機控制工程第四節線程同步各種方法比較五一個簡單的規則:如果某個操作必須等待另一個操作完成,則考慮使用事件對象;同一時刻,同一個應用程序指定個數線程要訪問同一資源,則使用信號量;同時訪問同一個資源的應用程序多于1個,應該使用互斥對象;否則使用臨界區。計算機控制工程第五節多線程兩臺計算機串口通信程序以串口程序設計為例說明:使用WinAPI編寫串口程序時,為實現事件驅動方式,可以考慮單獨建立一個線程,在該線程中循環檢測串口事件,當串口發生感興趣事件時,就發送消息,通知其它線程到串口讀取數據。當使用多個串口時,使用多線程為每個串口開辟一個線程,處理各個串口的數據接收。當有接受數據時,通過某種方式傳輸給主線程進行顯示和處理。計算機控制工程多線程應用框架一以兩臺計算機間通信的程序為例多線程編程的具體方法。…….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(…){ …… //讀取串口操作 ……}第五節多線程兩臺計算機串口通信程序計算機控制工程兩臺計算機之間通信方式二第五節多線程兩臺計算機串口通信程序1.通過網線傳輸2.通過USB線傳輸3.通過并口傳輸(SPP、ECP)4.通過串口傳輸(2RxD、3TxD號線對調)計算機控制工程第五節多線程兩臺計算機串口通信程序通信協議三1.通信流程通信采用發送/應答半雙工方式。通信過程分為:發送請求和發送文件兩個過程。發送請求:發送方首先發出請求包,并等待應答方響應。若收到應答方ACK(6)響應,發送數據包;若收到應答方NAK(21)響應,重發請求包;若收到應答方CAN(24)響應,取消本次發送請求;計算機控制工程第五節多線程兩臺計算機串口通信程序發送文件:發送方將待發送的文件以1024字節為單位拆分成N個數據片段,最后一個數據片段長度不定。每次使用普通數據包發送一個數據片段,若接受方接受正確,會發送一個ACK響應,發送方在收到正確的響應后,繼續發送含有下一個數據片段的普通數據包;若發送方收到NAK響應,則重發上一次發送的普通數據包。這個發送過程需要循環N-1次。當發送方發送到第N個數據片段時,使用結束包格式進行發送,若接受方正確響應ACK,則通信正常結束;若接受方響應NAK,則發送方重發含有第N個數據片段的接受包計算機控制工程第五節多線程兩臺計算機串口通信程序重要說明:發送方對于同一個數據包的重發操作,設定最多進行3次。3次后,發送方若仍接受不到ACK響應,則中斷文件傳輸操作,并提示通信錯誤。思考:
如用4個字節表示文件長度;則文件最大長度是多少?給定合法長度文件,如何填裝4個字節;計算機控制工程第五節多線程兩臺計算機串口通信程序數據包格式四1.請求包長度由文件名長度決定從ENG開始到其前面所有字節的異或運算和2.普通數據包計算機控制工程3.結束包第五節多線程兩臺計算機串口通信程序4.響應包:長度固定為1個字節。計算機控制工程第五節多線程兩臺計算機串口通信程序通信實現思路五通信程序使用WindowsAPI事件驅動方式、多線程技術。在程序中,為通信的事件檢測設立一個單獨的事件線程,該線程負責監視串口事件。當串口收到字符或發生讀超時時,該線程便發送相應消息。通信消息響應函數捕獲事件線程發送的消息,并根據消息類型進行處理。所有消息公用一個消息響應函數,故設置3個反映當前通信狀態的變量,進入消息響應函數后,通過對這些通信狀態變量值的不同采取不同的操作。計算機控制工程第五節多線程兩臺計算機串口通信程序1.功能描述雙機通信程序。既可作為發送方使,也可作為接受方使用。程序運行后,自動進入接受態。2.事件線程函數
為處理通信事件,專門建立一個事件線程。在該事件線程函數中,監視串口事件的當前消息,包括是否收到新字符和是否發送超時。當收到新字符或發生超時,便發送Windows消息。計算機控制工程第五節多線程兩臺計算機串口通信程序事件線程函數處理流程圖計算機控制工程3.消息響應函數第五節多線程兩臺計算機串口通信程序既可作為發送又可作為接受程序:1:發送狀態;10:接受狀態0態:表示發送操作尚未開始,程序處于接受狀態。程序初次啟動或完成一次傳送后處于該狀態。1態:表示發送操作已經開始,請求包已經發出,等待接受方響應。若接受方響應NAK,則重發請求包;若接受方響應ACK,則發送方判斷文件長度,若文件長度大于1024字節,則發送第一個普通數據包,然后將發送操作置為2態,否則發送結束數據包,然后將發送狀態置為3態。2態:表示發送操作已經開始,并且第一個普通包已經發出,等待接受方響應。若響應NAK:重發;狀態不變若響應CAN:取消;若響應ACK:計算剩余部分長度,如大于1024字節,則繼續發送普通數據包,狀態不變,否則發送結束數
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 IEC 60721-3-3:1994+AMD1:1995+AMD2:1996 CSV EN-D Classification of environmental conditions - Part 3-3: Classification of groups of environmental parameters and their severit
- 【正版授權】 IEC TR 61850-90-21:2025 EN Communication networks and systems for power utility automation - Part 90-21: Travelling Wave Fault Location
- 【正版授權】 IEC 60335-2-40:2024 EXV-CMV EN Household and similar electrical appliances - Safety - Part 2-40: Particular requirements for electrical heat pumps,air-conditioners and dehu
- 【正版授權】 IEC 60227-3:1993+AMD1:1997 CSV FR-D Polyvinyl chloride insulated cables of rated voltages up to and including 450/750 V - Part 3: Non-sheathed cables for fixed wiring
- 社區慢病管理方法
- 2025年德育個人工作方案幼兒園演講稿
- 護理學休克病人的急救護理
- 合同履行監督與評估指南
- 術后譫妄護理個案
- 保育員培訓配合教育活動
- 高效時間管理技能-GTD課件
- 《調整心態,積極迎考》主題心理班會
- 電流與電壓和電阻實驗報告單
- 喬木、灌木栽植方案
- 《空中領航學》8.5 精密進近程序的五邊進近
- 中國胸痛中心認證標準(標準版、基層版)
- 利益平衡理論及其在民事訴訟中的運用
- 《藝術學概論考研》課件藝術內涵的演變
- 資料員崗位季度績效考核表
- 鋪軌基地臨建方案
- 《環境規劃與管理》課件[1]
評論
0/150
提交評論