在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

基于Windows NT多線程實現智能蓄電池遠程監控系統的設計

電子設計 ? 來源:電子技術應用 ? 作者:王金廉,謝劍英, ? 2021-05-28 10:55 ? 次閱讀

作者:王金廉,謝劍英,賈青

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

1 Windows NT 多線程概述

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

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

· 使用C多線程庫函數;

· 使用CreateThread() 等Win32函數;

· 使用MFC類。

本文采用第三種方法。在Visual C++5.0 中,MFC應用程序用CWinThread 對象表示線程?;静僮魅缦拢?/p>

· 創建新線程:調用MFC全局函數AfxBeginThread ()創建新線程。AfxBeginThread()啟動新線程并返回控制,然后,新線程和調用

AfxBeginThread()的線程同時運行。它的返回值為指向CWinThread對象的指針;

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

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

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

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

根據上述順序調用函數建立連接后,通信雙方便可交換數據[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 lpSecurityAttrs=NULL);

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

UINT MyControllingFunction?(LPVOID pParam); ?

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

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

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

typedef struct

?{ SOCKET sServerSOCKET.htm” target=“_blank” title=“Socket貨源和PDF資料”》Socket;?

SOCKET ?*pcCoientSOCKET.htm“ target=”_blank“ title=”Socket貨源和PDF資料“》Socket;?

SOCKADDR_IN ?*pClientAddr;?

BOOL *pbConnected;

unsigned char *pucBuffer?;

int *pnMessageLen?;

?} EXCHANGE_INFO;

在需要通信時,先聲明一個結構變量,再把變量的指針作為pParam參數,調用AfxBeginThread((AFX_THREADPROC)

CSOCKET.htm” target=“_blank” title=“Socket貨源和PDF資料”》SocketThread::?WaitFor ConnectThread,(LPVOID)& m_Exchangeinfo)函數即可。

為了利用面向對象技術編程所具有的模塊性強、便于修改、可移植性好等優點,本文還把表1中的線程封裝為父類為CWinThread的自定義類CSOCKET.htm“ target=”_blank“ title=”Socket貨源和PDF資料“》SocketThread中。還自定義了一個叫CSOCKET.htm” target=“_blank” title=“Socket貨源和PDF資料”》SocketComm的新類,封裝了一些函數,如CreateSOCKET.htm“ target=”_blank“ title=”Socket貨源和PDF資料“》Socket、ConnectToServer、WaitForClient、ReadMessage、SendMessage等,這些函數屏蔽了面向連接的通信程序的實現細節,如創建、連接、發送和接收等,在這些函數里,動態創建輔助線程。

下面以CSOCKET.htm” target=“_blank” title=“Socket貨源和PDF資料”》SocketComm類中的等待客戶連接請求的函數WaitForClient()為例,注釋說明多線程編程的具體細節。

BOOL CSOCKET.htm“ target=”_blank“ title=”Socket貨源和PDF資料“》SocketComm::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.htm” target=“_blank” title=“Socket貨源和PDF資料”》Socket,( LPSOCKADDR)&Addr,sizeof (SOCKADDR_IN )); ?

if?(nReturnValue == SOCKET_ERROR) returu?( FALSE );?

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

m_Exchangeinfo.sServerSOCKET.htm“ target=”_blank“ title=”Socket貨源和PDF資料“》Socket = m_sserverSOCKET.htm” target=“_blank” title=“Socket貨源和PDF資料”》Socket;?

m_Exchangeinfo.psClientSOCKET.htm“ target=”_blank“ title=”Socket貨源和PDF資料“》Socket = &m_sClientSOCKET.htm” target=“_blank” title=“Socket貨源和PDF資料”》Socket;?

m_Exchangeinfo.pClientAddr = &m_ClientAddr;?

m_Exchangeinfo.pbConnected = &m_bConnected;?

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

AfxBeginThread?((AFX_THREADPROC)CSOCKET.htm“ target=”_blank“ title=”Socket貨源和PDF資料“》SocketThread::

WaitForConnectThread,?(LPVOID) &m_Exchanginfo); ?

returi?( TRUE )?

?}

//等待連接線程

UINT CSOCKET.htm” target=“_blank” title=“Socket貨源和PDF資料”》SocketThread::WaitForConnectThread?(LPVOIDpParam)

?{

EXCHANGE_INFO?*pExchangelnfo=(EXCHANGE_INFO*) pParam;?

int nReturnValue, nClientAddrSize= Sizeof?( SOCKADDR_IN);

//偵聽連接

nReturnValue=:: listen?(pExchangelnfo ->sServerSOCKET.htm“ target=”_blank“ title=”Socket貨源和PDF資料“》Socket, 1); ?

if?( nReturnValue == SOCKET_ERROR )return?(0);?

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

? *pExchangelnfo->psClitentSOCKET.htm” target=“_blank” title=“Socket貨源和PDF資料”》Socket=:: accept?(pExchangelnfo->sServerSOCKET.htm“ target=”_blank“ title=”Socket貨源和PDF資料“》Socket,? ?(LPSOCKADDR) pEchangelnfo ->pClientAddr,?&nClientAddrSize); ?

if?(( *pExchangelnfo->psClitentSOCKET.htm” target=“_blank” title=“Socket貨源和PDF資料”》Socket)!= INVALID_SOCKET)

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

? * pExchangelnfo->pbConnected TRUE;

return?( 0 );?

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

在電廠和電站中,為了保證安全工作,保護系統必不可少。保護系統的電源供應通常使用兩種方式。一般情況下,使用交流電系統對保護系統進行供電;當交流電系統出現故障時?立即使用后備的蓄電池系統對保護系統進行供電。為了對蓄電池系統進行監控和管理,以保證蓄電池在關鍵時刻能正常工作,設計了在Windows NT環境下具有遠程通訊功能和動態人機界面的智能蓄電池遠程監控系統 。該系統由蓄電池智能管理、充電機控制、母線絕緣在線檢測、聲光報警、系統組態、遠程通信等子系統組成,實現對蓄電池/充電機智能化遠程管理和控制,對整個系統的運行狀態進行實時監控,具有多媒體報警、事件處理、動態數據庫、趨勢畫面和動態畫面顯示、操作提前提醒等功能。系統框圖如圖2所示。

在遠程通信模塊中,遠程監控機需把監控客戶的操作命令及時傳給本地機,本地機根據命令控制充電機,使之按照一定的方式工作,而本地機需定時向遠程監控機反饋實時的充電機狀態信息。它們之間的通信是基于TCP/IP的廣域網通信,而且,我們引進了多線程機制以保證系統具有良好的實時性。

下面以其中的充電機控制系統為例談談如何使用CSOCKET.htm“ target=”_blank“ title=”Socket貨源和PDF資料“》SocketComm類進行遠程通信。為簡單起見,假定本地機與遠程監控機之間通信的信息僅有下面三種類型:

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

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

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

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



其中@為幀起始標志,#為幀終結標志對應的結構定義如下:

typedef struct

?{ int MessageType;? //信息類型

int ChargerNo;? //充電機編號

int DataNo;? //數據類型

float Data;? //數據

?}MessageStruct;?

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

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

責任編輯:gt

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

    關注

    21

    文章

    4008

    瀏覽量

    180640
  • 線程
    +關注

    關注

    0

    文章

    507

    瀏覽量

    20048
  • 電池
    +關注

    關注

    84

    文章

    10901

    瀏覽量

    133513
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    用單片機實現蓄電池遠程數據采集系統

    本帖最后由 eehome 于 2013-1-5 10:11 編輯 <strong>用單片機實現蓄電池遠程數據采集系統</strong>
    發表于 09-17 15:23

    LEM蓄電池在線監測設計方案

    ,同時也是不間斷供電系統里面最不安全的因素。從系統理論我們知道,系統的安全程度取決于系統中最不安全的因素,也就是我們經常引用的“木桶理論”。 二、
    發表于 03-10 10:22

    基于無線通信傳輸的蓄電池定位防盜系統

    康研發的蓄電池定位防盜器是將GPS定位器緊貼在蓄電池的側面,當定位數據超過設定范圍,系統立即上傳到監控中心,定位防盜追蹤和偽裝效果都非常好?!    ?/div>
    發表于 09-05 17:04

    BM-3000系列UPS/EPS蓄電池監測管理系統

    BM-3000系列UPS/EPS蓄電池監測管理系統,凝聚巨成多年技術成果,針對UPS/EPS電源系統特點,完成了真正意義的蓄電池實時監控。B
    發表于 09-21 17:31

    蓄電池定位防盜器 蓄電池的守護神

    為化學能,需要放電時再次把化學能轉換為電能輸出。蓄電池是通信基站供電系統的主要蓄電手段,由于全國電力資源緊缺,供電部門頻繁實施錯峰拉閘限電措施,經常出現基站大面積停電,這個時候就需要用到蓄電池
    發表于 10-24 14:29

    蓄電池測試儀在在線系統的應用案例

    福祿克公司最新的蓄電池測試儀KUNLUN產品提供試用活動,他們當即決定帶福祿克工程師及測試儀器到現場進行巡檢?! 〈舜窝矙z的災備機房配有超過4千節電池,并全部配有某品牌的在線蓄電池監控
    發表于 08-10 15:43

    萊姆電子蓄電池監控智能傳感器

      要點:?監測單只鉛酸蓄電池的內阻、電壓和內部溫度?大大降低整體蓄電池監控系統的成本?能夠延長蓄電池壽命?有助于增強后備電源
    發表于 10-26 16:17

    萊姆電子蓄電池監控智能傳感器

      萊姆電子推出目前業界最完備的蓄電池監控智能傳感器Sentinel。該產品設計用于備用蓄電池監控,可測量每只
    發表于 12-03 10:17

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

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

    機車蓄電池檢測與地面監控系統

    在機車輔助供電系統中,檢測蓄電池工作狀態,找出不良蓄電池是很重要的。本文以東風8B型內燃機車為對象,設計了一套蓄電池智能檢測
    發表于 07-14 16:16 ?15次下載

    基于現有監控系統蓄電池精確監控與故障預測方法

    摘要:現有動力環境監控系統蓄電池監控功能相對薄弱,沒有實現智能
    發表于 02-15 14:48 ?22次下載

    通信電源監控系統蓄電池監控模塊的設計

    通信電源集中監控系統作為通信電源運行維護的重要支撐手段,將發揮越來越重要的作用。文章對本地用通信電源監控系統蓄電池
    發表于 12-26 10:34 ?3449次閱讀

    汽車蓄電池電壓監控系統

    電子設計一個汽車蓄電池電壓監控系統完整資料。
    發表于 12-30 15:55 ?2次下載

    監控機房蓄電池的主要作用及內容

    可以提前進行報警,方面管理查看; 2,蓄電池數據可以24實時檢測,測量準確數據,掌握電池的各種情況,減少人工維護工作量 3,可以進行自動換管理,實現遠程的數據
    發表于 12-19 21:12 ?3103次閱讀

    UPS蓄電池遠程監測系統解決方案

    。 UPS蓄電池遠程監測系統是一種集成了數據采集、遠程監控、故障預警、數據分析與報告等功能于一體的智能
    的頭像 發表于 12-23 15:16 ?651次閱讀
    主站蜘蛛池模板: 777欧美午夜精品影院 | 轻点灬大ji巴太粗太大了小说 | 一级全免费视频播放 | 美女视频一区 | 啪啪小视频网站 | 免费毛片网站 | 色噜噜狠狠狠狠色综合久 | 欧美三级免费看 | 成人性欧美丨区二区三区 | 婷婷综合丁香 | 天天干天天拍天天操 | 一级女人毛片人一女人 | 欧美一级黄色片 | 亚洲 成人 欧美 自拍 | 亚洲国产欧美视频 | 手机看片中文字幕 | 永久免费在线视频 | 四虎影在线永久免费观看 | 欧美一级视频在线观看 | 曰韩欧美| 成人欧美一区二区三区的电影 | 国产精欧美一区二区三区 | 久久精品国产清自在天天线 | 亚洲狠狠婷婷综合久久久图片 | 日本特黄a级高清免费大片18 | 欧美天堂在线视频 | 失禁h啪肉尿出来高h男男 | 特黄特级高清免费视频毛片 | 涩五月婷婷 | 欧美巨波霸乳影院67194 | 国产在线一卡 | 欧美人与zoxxxx视频 | 日韩一级欧美一级一级国产 | 美女露出扒开尿口让男人桶 | 在线欧美成人 | 男女视频在线看 | 1024国产看片在线观看 | 色依依视频视频在线观看 | 午夜网站视频 | 亚洲成a人片在线网站 | 久久aa毛片免费播放嗯啊 |