色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于Windows NT操作系統(tǒng)設計TCP/IP的多線程通信系統(tǒng)的設計

電子設計 ? 來源:電子技術應用 ? 作者:王金廉,謝劍英, ? 2020-06-08 07:49 ? 次閱讀

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

1、Windows NT 多線程概述

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

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

· 使用C多線程庫函數;

· 使用CreateThread() 等Win32函數;

· 使用MFC類。

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

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

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

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

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

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

基于Windows NT操作系統(tǒng)設計TCP/IP的多線程通信系統(tǒng)的設計

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

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

AfxBeginThread()函數的用法如下:

CWinThread*AfxBeginThread (AFX_THREADPROC pfnThreadproc,

LPVOID pParam

int nPriority=THREAD_PRIORITY_NORMAL,

UINT nStackSixe=0,

DWORD dwCreateFlags=0,

LPSECURITY_ATTRIBUTES lpSecurityAttrs=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)函數即可。

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

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

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_sserverSocket;

m_Exchangeinfo.psClientSocket = &m_sClientSocket;

m_Exchangeinfo.pClientAddr = &m_ClientAddr;

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、應用實例-高層協(xié)議的設計

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

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

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

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

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

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

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

對應的結構定義如下:

typedef struct

{ int MessageType; //信息類型

int ChargerNo; //充電機編號

int DataNo; //數據類型

float Data; //數據

}MessageStruct;

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

總之,把多線程機制引進通信,有利于提高應用程序的實時性,充分利用系統(tǒng)資源。對于大型的工程應用來說,不同的線程完成不同的任務,也有利于提高程序的模塊化,便于維護和擴展。本文給出了一種在Windows NT下基于TCP/IP協(xié)議的多線程通信的基本方法,根據該方法進行修改和擴充,便可設計出符合具體應用的高質量的多線程通信程序。

責任編輯:gt


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • WINDOWS
    +關注

    關注

    3

    文章

    3541

    瀏覽量

    88633
  • 操作系統(tǒng)

    關注

    37

    文章

    6808

    瀏覽量

    123290
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19675
收藏 人收藏

    評論

    相關推薦

    #操作系統(tǒng)原理 多線程模型

    操作系統(tǒng)多線程模型
    電子技術那些事兒
    發(fā)布于 :2022年10月17日 22:32:33

    基于TCP/IP協(xié)議和多線程通信軟件的設計與實現

    ,解析后以數據表格形式顯示。重點探討了客戶端/服務器模式下基于TCP/IP協(xié)議通信多線程實現過程,并利用時序圖和活動圖進行具體描述。討論了在軟件安裝調試過程中如何解決客戶端死機問題和
    發(fā)表于 05-06 09:02

    【NanoPi K1 Plus試用體驗】多線程&TCP通信

    TCP通信是最常見的傳輸層網絡通信協(xié)議,在Linux系統(tǒng)中非常常見,建立TCP通信的基礎是傳輸層
    發(fā)表于 09-13 00:27

    Java操作系統(tǒng)支持多線程

    Windows操作系統(tǒng)均支持多線程進程的并發(fā)處理機制。操作系統(tǒng)支持多線程,使多個程序能夠并發(fā)執(zhí)行,以改善資源使用率和提高
    發(fā)表于 08-05 06:06

    基于TCP/IP協(xié)議的多線程通信的基本方法

    本文給出了一種在Windows NT下基于TCP/IP協(xié)議的多線程通信的基本方法,根據該方法進行
    發(fā)表于 02-04 07:08

    基于51單片機的多線程操作系統(tǒng) 精選資料分享

    我知道,在51單片機上運行一個操作系統(tǒng),大多數情況下并不實用。但51單片機廣為人知。所以我認為,用它來逐步的實現一個多線程操作系統(tǒng),使得讀者以更多的精力思考操作系統(tǒng)的設計,弱化芯片本身
    發(fā)表于 07-20 07:55

    如何利用多線程去構建一種TCP并發(fā)服務器

    TCP并發(fā)服務器,并實現客戶端和服務器的傳輸(多個并發(fā)用戶同時訪問服務器)實驗原理:TCP的傳輸模型和線程的并發(fā)執(zhí)行三、主要儀器設備PC機、裝有Linux操作系統(tǒng)的虛擬機四、...
    發(fā)表于 12-22 08:03

    Windows CE下多線程串口通信

    本文重點描述了在Windows CE5.0 內核下實現PC/104 與GPS 的通信,構建了PC/104 讀寫GPS 信息的硬件系統(tǒng),深入剖析了Windows CE5.0 下進行
    發(fā)表于 06-04 08:37 ?28次下載

    利用TCP/IP實現Windows與Vxworks的通信

    結合TCP/IP 在某測控系統(tǒng)的實際應用,討論了在嵌入式實時操作系統(tǒng)VxWorks和Windows 間實現網絡
    發(fā)表于 08-05 09:27 ?17次下載

    多線程同步機制在應用程序與驅動程序通信中的應用

    本文對Windows NT 操作系統(tǒng)多線程同步機制和同步對象進行了分析,以其在檢測儀和經緯儀同步通信程序開發(fā)中的應用為例,論述了如何通過共
    發(fā)表于 08-24 10:02 ?16次下載

    多線程在VC++串口通信程序中的應用

    本文通過一機房監(jiān)控系統(tǒng)程序中串口通信多線程的應用來介紹Windows 9X/NT操作系統(tǒng)
    發(fā)表于 09-03 11:45 ?27次下載

    什么是Windows CE,LynxOS是什么操作系統(tǒng)

    什么是Windows CE   Microsoft Windows CE是從整體上為有限資源的平臺設計的多線程、完整優(yōu)先權、多任務的操作系統(tǒng)。它的模塊化設計允許它
    發(fā)表于 06-17 00:36 ?1871次閱讀

    linux多線程編程技術

    (process)中只允許有一個線程,這樣多線程就意味著多進程。現在,多線程技術已經被許多操作系統(tǒng)所支持,包括Windows/
    發(fā)表于 10-24 16:01 ?5次下載

    基于Windows 操作系統(tǒng)內核驅動的多核CPU 線程管理

    1 引言 本文分析了Windows 系統(tǒng)的進程調度機制,并設計了一種基于Windows 操作系統(tǒng)內核驅動的多核CPU 線程管理方法,實現了一
    發(fā)表于 10-31 11:02 ?0次下載
    基于<b class='flag-5'>Windows</b> <b class='flag-5'>操作系統(tǒng)</b>內核驅動的多核CPU <b class='flag-5'>線程</b>管理

    基于Windows NT多線程實現智能蓄電池遠程監(jiān)控系統(tǒng)的設計

    Windows NT是一個真正的搶占式多任務操作系統(tǒng)。在 Windows NT中,啟動一個應用程序就是啟動該應用程序的一個實例,即進程。進程
    的頭像 發(fā)表于 05-28 10:55 ?1836次閱讀
    基于<b class='flag-5'>Windows</b> <b class='flag-5'>NT</b><b class='flag-5'>多線程</b>實現智能蓄電池遠程監(jiān)控<b class='flag-5'>系統(tǒng)</b>的設計
    主站蜘蛛池模板: 最近的2019中文字幕HD| 人人看人人看| 久久久久久人精品免费费看| 和姐姐做插得很深| 国产人A片在线乱码视频| 国产精品久久久久久人妻精品蜜桃| seba51久久精品| 东北老妇人70OLDMAN| JIZJIZJIZ 日本老师水多| YELLOW视频直播在线观看高清| 99久久国产综合精品国| www.97干| 国产成人自拍视频在线观看| 国产亚洲精品久久无亚洲| 好男人的视频在线观看| 久久久97丨国产人妻熟女 | 一级毛片视频免费| 在线日本高清日本免费| 99午夜视频| 国产成人精品免费视频大全办公室| 国产色婷亚洲99精品AV在| 九色PORNY真实丨首页| 美女诱点第6季| 色狼亚洲色图| 樱桃视频高清免费观看在线播放| 91伊人久久大香线蕉| 粗壮挺进邻居人妻无码| 国产在线一卡二卡| 男女夜晚在爽视频免费观看| 日日噜噜夜夜躁躁狠狠| 伊人久久青青| 第七色男人天堂| 久久精品免视看国产| 日本久久和电影| 亚洲中文字幕乱倫在线| 处初女处夜情视频在线播放| 激情床戏视频片段有叫声| 色www精品视频在线观看| 在线观看免费av网| 国产精品九九久久| 欧美另类videosbest|