1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. 基于VC++的多線程通信程序設計論文

        時間:2020-06-15 12:28:17 通信工程畢業論文 我要投稿

        基于VC++的多線程通信程序設計論文

          介紹了Windows多線程技術、多線程間通信、以及多線程通信程序設計的主要函數,然后在前面關鍵技術的基礎上,采用VC++ 6.0 為開發平臺, 實現了一個基于VC++的多線程局域網聊天程序。

        基于VC++的多線程通信程序設計論文

          在多任務Windows編程中,為了提高代碼的時、空效率,廣泛采取后臺程序和前臺程序,而前臺任務及后臺任務是通過多線程技術來實現,從而線程間的通信就變得極為重要。Visual C++對Windwos線程和消息的多任務機制提供了強有力的支持,并封裝了大量的通信函數,給多線程通信程序編程帶來了很大的便利。

          1、多線程技術概述

          多線程在Windows編程中是一個比較重要的概念。所謂多線程,即在同一個程序中可以同時執行多個任務。這意味著,編程者可以將整個任務分成幾個線程,然后讓操作系統同時執行,從而提高程序的執行效率。一般線程被分為兩種:用戶界面線程和工作線程(又稱為后臺線程)。

          1.1 創建線程與終止線程

          創建線程的過程可以分成兩大步驟,首先編寫線程函數,然后創建線程,并將其參數線程函數地址指向剛剛編寫的線程函數。線程函數的退出,除了使用退出函數處理外,大都是隨著程序的結束而退出。

          1.2 線程同步

          多線程提高了程序執行的效率,提高了編程的靈活性,但同時也引入了新的問題。線程之間經常要同時訪問一些資源,因此對共享資源進行訪問引起沖突是不可避免的。另外,在Windwos的消息驅動方式下,必須某個事件的發生了,才可以執行某個線程,為了解決上述問題,必須引入線程同步的概念。Win32 API提供了多種同步控制對象,包括臨界區、互斥對象、信號量和事件。

          2、多線程間通信

          一般而言,應用程序中的一個次要線程總是為主線程執行特定的任務,這樣,主線程和次要線程間必定有一個信息傳遞的渠道,也就是主線程和次要線程間要進行通信。這種線程間的通信不但是難以避免的,而且在多線程編程中也是復雜和頻繁的。多線程間通信可以采用全局變量、自定義消息、事件對象通信。

          1) 使用全局變量進行通信

          由于屬于同一個進程的各個線程共享操作系統分配該進程的資源,故解決線程間通信最簡單的一種方法是使用全局變量。對于標準類型的全局變量,可以使用volatile修飾符,它告訴編譯器無需對該變量作任何的優化,即無需將它放到一個寄存器中,并且該值可被外部改變。如果線程間所需傳遞的信息較復雜,可以定義一個結構,通過傳遞指向該結構的指針進行傳遞信息。

          2) 使用自定義消息進行通信

          可以在一個線程的執行函數中向另一個線程發送自定義的消息來達到通信的目的。一個線程向另外一個線程發送消息是通過操作系統實現的。利用Windows操作系統的消息驅動機制,當一個線程發出一條消息時,操作系統首先接收到該消息,然后把該消息轉發給目標線程,接收消息的線程必須已經建立了消息循環。

          3) 使用事件對象進行通信

          在線程之間傳送信號的一種比較復雜的方法是使用享件對象,在MFC中有一個事件類CEvent。一個事件對象可以處于兩種狀態的一種:信號態和非信號態。線程能夠監視處于信號態的事件,以便在適當的時間執行對事件的操作。

          3、多線程通信程序設計

          3.1 重要函數

          1) Win32 API對多線程編程的支持

          Win32提供了一系列的API函數來完成線程的創建、掛起、恢復、終結以及通信等工作。下面將選取其中的一些重要函數進行說明。

         、貶ANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);

          該函數在其調用進程的進程空間里創建一個新的線程,并返回已建線程的句柄,如果創建成功則返回線程的句柄,否則返回NULL。

         、贒WORD SuspendThread(HANDLE hThread);

          該函數用于掛起指定的線程,如果函數執行成功,則線程的執行被終止。

         、跠WORD ResumeThread(HANDLE hThread);

          該函數用于結束線程的掛起狀態,執行線程。

          ④VOID ExitThread(DWORD dwExitCode);

          該函數用于線程終結自身的執行,主要在線程的執行函數中被調用。其中參數dwExitCode用來設置線程的退出碼。

          ⑤BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);

          一般情況下,線程運行結束之后,線程函數正常返回,但是應用程序可以調用TerminateThread強行終止某一線程的執行。使用TerminateThread()終止某個線程的執行是不安全的,可能會引起系統不穩定;雖然該函數立即終止線程的.執行,但并不釋放線程所占用的資源。因此,一般不建議使用該函數。

         、轇OOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);

          該函數將一條消息放入到指定線程的消息隊列中,并且不等到消息被該線程處理時便返回。調用該函數時,如果即將接收消息的線程沒有創建消息循環,則該函數執行失敗。

          2) MFC對多線程編程的支持

          MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程。二者的主要區別在于工作者線程沒有消息循環,而用戶界面線程有自己的消息隊列和消息循環。

          工作者線程沒有消息機制,通常用來執行后臺計算和維護任務,如冗長的計算過程,打印機的后臺打印等。用戶界面線程一般用于處理獨立于其他線程執行之外的用戶輸入,響應用戶及系統所產生的事件和消息等。但對于Win32的API編程而言,這兩種線程是沒有區別的,它們都只需線程的啟動地址即可啟動線程來執行任務。

          在MFC中,一般用全局函數AfxBeginThread()來創建并初始化一個線程的運行,該函數有兩種重載形式,分別用于創建工作者線程和用戶界面線程。兩種重載函數原型和參數分別說明如下:

          ①CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,LPVOID pParam,

          nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0,

          DWORD dwCreateFlags=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

         、贑WinThread* AfxBeginThread(CRuntimeClass* pThreadClass,

          int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize=0,

          DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

          一般情況下,調用AfxBeginThread()來一次性地創建并啟動一個線程,但是也可以通過兩步法來創建線程:首先創建CWinThread類的一個對象,然后調用該對象的成員函數CreateThread()來啟動該線程。

         、踲irtual BOOL CWinThread::InitInstance();

          重載該函數以控制用戶界面線程實例的初始化。初始化成功則返回非0值,否則返回0。用戶界面線程經常重載該函數,工作者線程一般不使用InitInstance()。

          ④virtual int CWinThread::ExitInstance();

          在線程終結前重載該函數進行一些必要的清理工作。該函數返回線程的退出碼,0表示執行成功,非0值用來標識各種錯誤。同InitInstance()成員函數一樣,該函數也只適用于用戶界面線程。

          3.2 VC++下多線程局域網聊天程序

          聊天程序是現代生活中不可缺少的通信工具,為了在局域網中實現點對點的實時通信,在VC++的編程環境中,利用套接字庫技術和多線程編程技術實現聊天程序。

          1) 界面設計。界面設計如圖1所示。

          2) 函數

          void CMyQQDlg:: SendMsg() //發送消息

          void CMyQQDlg:: SendFile() //發送文件

          void CMyQQDlg:: Caputer() //抓取屏幕

          void CMyQQDlg::AddMsgList(CString IP,CString str) //添加信息于LISTBOX 控件中

          CString CMyQQDlg::GetError(DWORD error) //返回錯誤信息

          int CMyQQDlg::GetLocalHostName(CString &sHostName) //獲得本地計算機名稱

          int CMyQQDlg::GetIpAddress(const CString &sHostName, CString &sIpAddress)//獲得本地IP

          int CMyQQDlg::GetNamebyAddress(const CString &IpAddress,CString &sYouName)//獲得對方計算機名稱

          3) 線程啟動

          pThreadLisen=::AfxBeginThread(_ListenTcpThread,this); //開始TCP線程

          pThreadLisen=::AfxBeginThread(_UDPThread,this); //開始UDP線程

          4) 服務器線程

          UINT _ListenTcpThread(LPVOID lparam) //TCP監聽線程

          UINT _UDPThread(LPVOID lparam) //UDP接受信息線程開始

          5) 客戶端線程

          UINT _SendFileThread(LPVOID lparam) //發送文件線程

          UINT _SendMsgThread(LPVOID lparam) //TCP發送信息線程

          UINT _SendMsgUdpThread(LPVOID lparam) //UDP發送信息

          UINT _ThreadCapture(LPVOID lparam) //抓取對方屏幕線程

          以上程序在Windows XP, Microsoft Visual C++6.0中編譯執行通過。

          4、結束語

          要設計出性能較好的多線程通信程序,不僅需要對操作系統的處理過程很清楚,還需要對VC++的線程處理函數十分了解,并對具體應用中各線程的關系非常清楚,以利于在應用程序中控制同步事件的發生,避免出現死鎖或不能同步處理的現象。

        【基于VC++的多線程通信程序設計論文】相關文章:

        1.基于Vxworks實時操作系統的串口通信程序設計與實現

        2.基于AMF的Android數據通信論文

        3.關于多線程技術在數據通信中的運用分析論文

        4.基于分層思想的基本通信系統CPN建模論文

        5.淺談基于單片機的數據串口通信研究論文

        6.基于融合通信服務的完美體驗淺析論文

        7.基于GPRS的無線通信模塊的原理及設計論文

        8.基于LED的光通信系統的設計與實現論文

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>