青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽牛散步
仗劍走天涯
基于TCP/IP的多線程通信及其在遠程監控系統中的應用


  傳統的應用程序都是單線程的,即在程序運行期間,由單個線程獨占CPU的控制權,負責執行所有任務。在這種情況下,程序在執行一些比較費時的任務時,就無法及時響應用戶的操作,影響了應用程序的實時性能。在監控系統,特別是遠程監控系統中,應用程序往往不但要及時把監控對象的最新信息反饋給監視客戶(通過圖形顯示),還要處理本地機與遠程機之間的通信以及對控制對象的實時控制等任務,這時 ,僅僅由單個線程來完成所有任務,顯然無法滿足監控系統的實時性要求。在DOS系統下,這些工作可以由中斷來完成。而在Windows NT下,中斷機制對用戶是不透明的。為此,可引進多線程機制,主線程專門負責消息的響應,使程序能夠響應命令和其他事件。輔助線程可以用于完成其他比較費時的工作,如通信、圖形顯示和后臺打印等,這樣就不至于影響主線程的運行。

  1 Windows NT 多線程概述

  Windows NT是一個真正的搶占式多任務操作系統。在 Windows NT中,啟動一個應用程序就是啟動該應用程序的一個實例,即進程。進程由一個或多個線程構成,擁有內存和資源,但自己不能執行自己,而是進程中的線程被調度執行。進程至少要有一個線程,當創建一個進程時,就創建了一個線程,即主線程。主線程可以創建其他輔助線程,由主線程創建的線程又可創建線程。每個線程都可指定優先級,操作系統根據線程的優先級調度線程的執行。

  Windows NT中使用多線程的方法有三種:

  · 使用C多線程庫函數;

  · 使用CreateThread() 等Win32函數;

  · 使用MFC類。

  本文采用第三種方法。在Visual C++5.0 中,MFC應用程序用CWinThread 對象表示線程。基本操作如下:

  · 創建新線程:調用MFC全局函數AfxBeginThread ()創建新線程。AfxBeginThread()啟動新線程并返回控制,然后,新線程和調用AfxBeginThread()的線程同時運行。它的返回值為指向CWinThread對象的指針;

  · 暫停/恢復線程:調用CWinThread類成員函數SuspendThread()暫停線程的運行,調用ResumeThread()成員函數恢復線程的運行;

  · 終止線程:在線程內部可調用全局函數AfxBeginThread()終止線程的運行,否則,線程執行結束后,線程自動從線程函數返回并釋放線程占有的資源。

  2 基于TCP/IP的多線程編程

  TCP/IP是lnternet上廣泛使用的一種協議,可用于異種機之間的互聯。TCP/IP協議本身是非常復雜的,然而在網絡編程中,程序員不必考慮TCP/IP的實現細節,只需利用協議的網絡編程接口Socket(亦稱套接字)即可。在 Windows 中,網絡編程接口是 Windows Socket它包含標準的Berkley Sockets的功能調用的集合,以及為 Windows 所做的一些擴展。TCP/IP協議的應用一般采用客戶/服務器模式,面向連接的應用調用如圖1所示。

  根據上述順序調用函數建立連接后,通信雙方便可交換數據。然而,在調用帶*號的函數時,操作常會阻塞,特別是當套接字工作在同步阻塞模式(Blocking Mode)時。這時,程序無法響應任何消息。為了避免出現這種情況,本文引進輔助線程。在執行含有可能阻塞的函數的任務時,動態創建新的線程,專門處理該任務。主線程把任務交給輔助線程后,不再對輔助線程加以控制與調度。本文分別針對connect()、accept()、receive()、send()等可能阻塞的函數創建了相應的線程,如表1所示。

  多線程編程常常還要考慮線程間的通信。線程間的通信可以采用全局變量、指針參數和文件映射等方式。本文采用指針參數方式。在調用AfxBeginThread()函數時,通過傳遞指針參數的方式在主線程與輔助線程間通信。

  AfxBeginThread()函數的用法如下:

  CWinThread*AfxBeginThread (AFX_THREADPROC pfnThreadproc,

  LPVOID pParam,

  int nPriority=THREAD_PRIORITY_NORMAL,

  UINT nStackSixe=0,

  DWORD dwCreateFlags=0,

  LPSECURITY_ATTRIBUTES pSecurityAttrs=NULL);

  參數pfnThreadProc指定線程函數必須如下定義:

  UINT MyControllingFunction(LPVOID pParam); 

  參數pParam 是調用線程傳遞給線程函數pfThreadProc的參數;

  其他參數一般只需采用缺省值。

  指針參數通信方式就是通過參數pParam在線程間通信的,它可為指向任何數據類型的指針。本文中,定義了一個名叫EXCHANGE_INFO的結構如下:

  typedef struct

  { SOCKET sServerSocket;

  SOCKET *pcCoientSocket;

  SOCKADDR_IN *pClientAddr;

  BOOL *pbConnected;

  unsigned char *pucBuffer;

  int *pnMessageLen;

  } EXCHANGE_INFO;

  在需要通信時,先聲明一個結構變量,再把變量的指針作為pParam參數,調用AfxBeginThread((AFX_THREADPROC) CSocketThread::WaitFor ConnectThread,(LPVOID)& m_Exchangeinfo)函數即可。

  為了利用面向對象技術編程所具有的模塊性強、便于修改、可移植性好等優點,本文還把表1中的線程封裝為父類為CWinThread的自定義類CSocketThread中。還自定義了一個叫CSocketComm的新類,封裝了一些函數,如CreateSocket、ConnectToServer、WaitForClient、ReadMessage、SendMessage等,這些函數屏蔽了面向連接的通信程序的實現細節,如創建、連接、發送和接收等,在這些函數里,動態創建輔助線程。

  下面以CSocketComm類中的等待客戶連接請求的函數WaitForClient()為例,注釋說明多線程編程的具體細節。

  BOOL CSocketComm::WaitForClient

  {

  if(m_bConnected)return( TRUE );

  //配置bind函數的參數即服務器的套接字地址結構

  SOCKADDR_IN Addr;

  memset(&Addr,0,sizeof(SOCKADDR_IN));

  Addr.sin_family=AF_INET;

  ADDR.SIN_port= htonl(m_nPort); 

  Addr.sin_addr.s_addrr = htonl(INADDR_ANY); 

  //將套接字地址結構賦予套接字(綁定),以指定本地半相關

  int nReturnValue;

  nReturnValue =::bind( m_sSserverSocket,( LPSOCKADDR)&Addr,sizeof (SOCKADDR_IN )); 

  if(nReturnValue == SOCKET_ERROR)  returu( FALSE );

  //配置傳給WaitForConnectThread線程函數的參數m_Exchangeinfo

  m_Exchangeinfo.sServerSocket = m_serverSocket;

  m_Exchangeinfo.psClientSocket = &m_sClientSocket;

  m_Exchangeinfo.pClientAddr = &m_lientAddr;

  m_Exchangeinfo.pbConnected = &m_bConnected;

  //以m_Exchangeinfo的指針為參數調用WaitforConnectThread線程等待客戶端連接

  AfxBeginThread((AFX_THREADPROC)CSocketThread::

  WaitForConnectThread,(LPVOID) &m_Exchanginfo); 

  returi( TRUE )

  }

  //等待連接線程

  UINT CSocketThread::WaitForConnectThread(LPVOIDpParam)

  {

  EXCHANGE_INFO*pExchangelnfo=(EXCHANGE_INFO*) pParam;

  int nReturnValue, nClientAddrSize= Sizeof( SOCKADDR_IN);

  //偵聽連接

  nReturnValue=:: listen(pExchangelnfo ->sServerSocket, 1); 

  if( nReturnValue == SOCKET_ERROR )return(0);

  //阻塞調用accept,直至有客戶連接請求

  *pExchangelnfo->psClitentSocket=:: accept(pExchangelnfo->sServerSocket, (LPSOCKADDR) pEchangelnfo ->pClientAddr,&nClientAddrSize); 

  if(( *pExchangelnfo->psClitentSocket)!= INVALID_SOCKET)

  //通過pExchangelnfo的指針在線程間通信

  * pExchangelnfo->pbConnected TRUE;

  return( 0 );



  3 應用實例-高層協議的設計

  在電廠和電站中,為了保證安全工作,保護系統必不可少。保護系統的電源供應通常使用兩種方式。一般情況下,使用交流電系統對保護系統進行供電;當交流電系統出現故障時立即使用后備的蓄電池系統對保護系統進行供電。為了對蓄電池系統進行監控和管理,以保證蓄電池在關鍵時刻能正常工作,設計了在Windows NT環境下具有遠程通訊功能和動態人機界面的智能蓄電池遠程監控系統 。該系統由蓄電池智能管理、充電機控制、母線絕緣在線檢測、聲光報警、系統組態、遠程通信等子系統組成,實現對蓄電池/充電機智能化遠程管理和控制,對整個系統的運行狀態進行實時監控,具有多媒體報警、事件處理、動態數據庫、趨勢畫面和動態畫面顯示、操作提前提醒等功能。系統框圖如圖2所示。在遠程通信模塊中,遠程監控機需把監控客戶的操作命令及時傳給本地機,本地機根據命令控制充電機,使之按照一定的方式工作,而本地機需定時向遠程監控機反饋實時的充電機狀態信息。它們之間的通信是基于TCP/IP的廣域網通信,而且,我們引進了多線程機制以保證系統具有良好的實時性。

  下面以其中的充電機控制系統為例談談如何使用CSocketComm類進行遠程通信。為簡單起見,假定本地機與遠程監控機之間通信的信息僅有下面三種類型:

  ·本地機接收到該命令后,控制充電機按照穩壓模式運行,輸出電壓為電壓給定值;

  ·本地機接收到該命令后,控制充電機按照穩流定時模式運行,輸出電流為電流給定值;

  ·本地機向遠程監控機發送充電機的實時狀態數據(包括輸出電壓、輸出電流、狀態指示和故障類型指示)。

  在基于TCP/IP的面向連接的網絡通信中,客戶與服務器之間傳送的是有序可靠的字節流(Byte Stream),所以程序員有必要在傳輸層TCP上定義自己的高層協議,設計幀結構,將字節流變成有意義的信息。在CSocketComm類中由AssembleMessage()函數把數據組合成一定的幀結構。幀結構為:



  其中@為幀起始標志,#為幀終結標志

  對應的結構定義如下:

typedef struct

{ int MessageType; //信息類型

int ChargerNo; //充電機編號

int DataNo; //數據類型

float Data; //數據

} MessageStruct;

  需要通信時,先聲明一個 MessageStruct變量,根據信息內容對各成員變量賦值,傳給 AssembleMessage()函數組合成幀,再調用SendMessage()函數發送給接受方。接受方接到數據后,對數據內容的解釋,是由CsocketComm類中的AnalyzeMessage()函數完成的。AnalyzeMessage()函數返回一個 MessageStruct變量。應用程序就可根據它的各成員變量控制充電機或動態顯示充電機的狀態。

  總之,把多線程機制引進通信,有利于提高應用程序的實時性,充分利用系統資源。對于大型的工程應用來說,不同的線程完成不同的任務,也有利于提高程序的模塊化,便于維護和擴展。本文給出了一種在Windows NT下基于TCP/IP協議的多線程通信的基本方法,根據該方法進行修改和擴充,便可設計出符合具體應用的高質量的多線程通信程序。
posted on 2005-12-16 17:27 牽牛散步 閱讀(1883) 評論(0)  編輯 收藏 引用
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲天堂av图片| 国产欧美日韩综合一区在线播放 | 亚洲国产美国国产综合一区二区| 欧美在线免费视频| 欧美在线免费观看亚洲| 久久在线视频| 亚洲激情视频在线| 亚洲丝袜av一区| 久久精品国产一区二区三区免费看| 久久精品国产第一区二区三区| 美女视频黄 久久| 欧美日韩免费观看一区二区三区| 国产精品国产三级国产专区53| 国产人成一区二区三区影院| 尤妮丝一区二区裸体视频| 亚洲精品一区二区三区蜜桃久| 亚洲一区二区三区视频播放| 久久久人成影片一区二区三区| 欧美国产日韩xxxxx| 亚洲视频在线免费观看| 久久久青草青青国产亚洲免观| 欧美电影免费网站| 国产亚洲午夜高清国产拍精品| 亚洲七七久久综合桃花剧情介绍| 亚洲欧美日韩国产中文| 欧美高清视频www夜色资源网| 日韩视频在线观看| 久久一本综合频道| 国产精品青草久久久久福利99| 影音欧美亚洲| 午夜精品久久久久久久久久久久久| 美女精品在线观看| 香蕉成人久久| 国产精品国产三级国产aⅴ9色 | 亚洲欧美在线一区| 欧美激情乱人伦| 久久成人羞羞网站| 国产酒店精品激情| 中文精品一区二区三区| 欧美mv日韩mv国产网站| 亚洲永久字幕| 欧美日韩国产成人在线免费| 亚洲国产成人av在线| 欧美连裤袜在线视频| 亚洲国产成人91精品| 亚洲一区在线看| 免费在线观看成人av| 亚洲综合色丁香婷婷六月图片| 欧美电影在线观看| 在线欧美日韩国产| 美女精品自拍一二三四| 久久av最新网址| 国内外成人免费激情在线视频网站| 午夜精品久久久久久久久久久| 亚洲精品中文字幕有码专区| 欧美激情精品久久久久久大尺度 | 美女视频一区免费观看| 国产综合久久久久久鬼色| 性色av香蕉一区二区| 亚洲午夜一区二区三区| 国产精品久久久久9999吃药| 亚洲素人在线| 亚洲性感激情| 国产欧美综合在线| 久久久中精品2020中文| 久久久久国产精品一区二区| 樱桃成人精品视频在线播放| 欧美成人亚洲成人日韩成人| 欧美mv日韩mv国产网站app| 亚洲欧洲日本mm| 最新亚洲电影| 国产精品激情| 久久精品综合网| 麻豆视频一区二区| 99综合在线| 亚洲欧美第一页| 在线观看91精品国产入口| 亚洲成人自拍视频| 欧美三级韩国三级日本三斤| 午夜视频在线观看一区| 久久精品系列| 日韩视频一区二区在线观看 | 亚洲性av在线| 国产一区二区三区在线观看精品 | 蜜桃伊人久久| 亚洲精品欧美精品| 亚洲午夜三级在线| 亚洲春色另类小说| 99成人在线| 国产一区深夜福利| 欧美顶级大胆免费视频| 欧美视频一区二区三区| 久久国产精品久久久久久电车| 久久久青草婷婷精品综合日韩| 日韩午夜激情av| 亚洲欧美综合精品久久成人| 亚洲国产精品999| 中文精品99久久国产香蕉| 国产又爽又黄的激情精品视频| 亚洲国产成人av在线| 国产精品久久久久毛片大屁完整版 | 国产真实乱偷精品视频免| 亚洲福利一区| 国产婷婷成人久久av免费高清| 亚洲激情社区| 亚洲成在人线av| 久久国产精品亚洲va麻豆| 亚洲一区二区欧美日韩| 老鸭窝亚洲一区二区三区| 性色av香蕉一区二区| 欧美精品123区| 久久人人超碰| 国产精品社区| 亚洲国产欧美一区二区三区同亚洲 | 久久久99精品免费观看不卡| 久久久久久久国产| 亚洲免费观看视频| 久久人人看视频| 久久精品国产亚洲精品| 欧美性视频网站| 亚洲乱码国产乱码精品精可以看| 在线观看视频日韩| 午夜视频在线观看一区二区三区| 亚洲伊人网站| 欧美精品在线一区二区| 亚洲级视频在线观看免费1级| 国产亚洲欧美另类中文| 亚洲裸体视频| 日韩亚洲国产精品| 欧美激情一区二区三区全黄 | 免费日韩精品中文字幕视频在线| 久久国产福利国产秒拍| 国产精品一二| 亚洲男人第一网站| 欧美在线观看你懂的| 国产欧美二区| 久久人人97超碰精品888| 国产精品免费观看在线| 亚洲一区综合| 久久精品理论片| 一区二区三区在线免费视频| 久久久99久久精品女同性| 免费成人黄色片| 亚洲日韩成人| 欧美日韩一区在线| 亚洲视频电影图片偷拍一区| 亚洲欧美bt| 国产欧美精品一区| 久久精品毛片| 亚洲黄网站在线观看| 一本一本大道香蕉久在线精品| 欧美日本一区二区视频在线观看| 亚洲免费高清| 欧美一区二区三区视频在线观看| 国产日韩欧美不卡在线| 久久久久国产精品厨房| 最新国产成人av网站网址麻豆| 中文国产一区| 韩国v欧美v日本v亚洲v| 欧美成人国产| 亚洲一区二区三区四区五区黄| 久久久之久亚州精品露出| 91久久久国产精品| 国产精品视频免费| 猛男gaygay欧美视频| 一区二区三区四区五区在线| 久久久美女艺术照精彩视频福利播放| 亚洲高清毛片| 国产精品久久久久久久久久免费 | 精品电影一区| 欧美日韩亚洲一区二区三区四区| 亚洲女人天堂av| 亚洲高清视频在线| 亚洲欧美日韩在线观看a三区| 激情欧美日韩一区| 国产精品久久国产精品99gif | 欧美一级久久| 99re8这里有精品热视频免费| 国产欧美日韩一区二区三区| 欧美jizzhd精品欧美巨大免费| 在线一区二区三区四区| 免费视频久久| 欧美专区18| 日韩一区二区高清| 激情欧美日韩| 国产日韩精品一区| 欧美日韩国产欧美日美国产精品| 久久er精品视频| 亚洲一区二区三区中文字幕在线| 亚洲国产精品一区| 久久综合九色99| 久久成人国产| 亚洲自拍电影| 一本久道久久综合中文字幕| 精品成人一区二区三区四区| 国产日韩欧美高清| 欧美性一二三区| 欧美日韩在线大尺度| 欧美精品国产精品日韩精品| 老**午夜毛片一区二区三区|