国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

用Visual C++實現(xiàn)工控設備多線程控制程序

發(fā)布時間:2009-3-25 16:45    發(fā)布者:李寬
關鍵詞: Visual , 工控 , 設備 , 線程
多線程技術的引入,不僅可以挖掘潛在的CPU空閑時間,而且還可以提高應用程序的反應速度,其優(yōu)點在有多個任務需要完成、有巨大數(shù)據(jù)流量的程序中反映得尤為明顯。而隨著VisualC++的引入,其靈活的線程實現(xiàn)機制使得程序員從繁瑣的Windows編程中解脫出來。關于多線程基本機理和實現(xiàn)方法近年來有許多文章介紹,這里不再贅述。本文將側重于比較在工控程序中采用各種線程類型和同步方法的優(yōu)劣,并給出一個實用的、有較廣適應性的程序主體框架。1 各種線程類型和同步方法
1.1 線程類型
Visual C++中線程分為工作者線程(Worker Thread)和用戶界面線程(User Interface Thread)兩大類。
用戶界面線程的特點是擁有單獨的消息隊列,可以具有自己的窗口界面,能夠對事件和用戶輸入做出響應,具體實現(xiàn)時由CWinThread派生出一個類。但其缺點是當需要停止或撤銷當前正在運行的線程而向其發(fā)送中止消息后,只有在消息隊列中排在前面的消息被一一處理完之后,線程才能接受中止消息并停止當前工作,這對CPU是一種浪費,在對實時性要求較高的工控程序中是不可容忍的。
工作者線程適用于處理后臺任務,而不影響用戶對應用程序的使用。工作者線程僅僅由一個函數(shù)體實現(xiàn),其實現(xiàn)簡單,便于編程者控制,與事件同步方法相配合能對中止消息做出較快反應。
1.2 同步方法
在多線程應用程序中,兩個或更多的線程同時訪問相同數(shù)據(jù)會導致不可預知的結果,因此保持線程間的同步是一個不可或缺的環(huán)節(jié)。VisualC++提供了四種同步方法:臨界區(qū)(Critical Section)、信號燈(Semaphore)、互斥量(Mutex)和事件(Event)。
其中采用臨界區(qū)、信號燈或互斥量進行同步時,線程間的同步過程由操作系統(tǒng)完全控制,系統(tǒng)僅僅防止多個線程對同一資源的同時使用,而相同優(yōu)先級的線程對同一資源的使用順序是編程者無法控制的。而在一般工控系統(tǒng)中,當主控臺下方設備數(shù)據(jù)變化時,應能及時中止當前的計算(如果當前計算未完成的話)并根據(jù)新的數(shù)據(jù)開始新一輪的計算,因而要求各線程對所處理的數(shù)據(jù)有一定的操作次序。
事件同步是通過將事件自身設置為有信號或無信號來通知其它線程某一操作已完成或尚未完成,其設置可由編程人員手工完成,適合于工控程序應用。盡管事件同步方式平均效率比上面三種方式稍低,但在工控程序應用中相對于因數(shù)據(jù)未能及時更新而導致大量的無用計算及其對實時性的損害來講,還是非常值得的。
下面介紹的是筆者參與某‘九五’預研項目中所設計的主控臺程序的基本框架,這個程序框架應能適用于大多數(shù)工控系統(tǒng)的主控程序。
2 軟件框架
一般工控系統(tǒng)的主控部分通常所必須完成的兩件事是1)通過通信端口與下端設備通信,接收下端設備傳來的數(shù)據(jù)或向下端設備發(fā)送指令;(2)對下端設備所傳數(shù)據(jù)進行處理。
與之相對應,該軟件具有一個主線程和兩個子線程,其中一個子線程為通信線程,另一個為計算線程。主線程是Windows下每個應用程序都具備的,負責線程間的同步、向計算線程和通信線程傳遞參數(shù)、管理人機界面、接收用戶輸入、數(shù)據(jù)庫的操作和管理等功能。通信線程通過通信端口(可以是串口、并口或網絡接口等)負責與下端的設備進行通信并交換數(shù)據(jù),當存在多級控制結構時,還可用來與更高一級的控制設備進行通信并向上傳遞數(shù)據(jù)。計算線程負責核心算法的實現(xiàn),根據(jù)系統(tǒng)的不同完成不同的數(shù)據(jù)處理任務。程序結構如圖1。

進程開始后先由主線程建立通信線程與計算線程。通信線程監(jiān)視通信端口,當下方設備發(fā)來數(shù)據(jù)時,就向主線程發(fā)送自定義的WM_USER_COMM_NOTIFY消息,通知主線程計算數(shù)據(jù)有所改變,主線程則對之進行處理,即中止當前的計算,并重新開始計算。
3 具體實現(xiàn)
用Visual C++的AppWizard生成一個應用程序,這是主控程序的雛形,該應用程序暫取名為CtrSys,后面程序名都以此為準。
3.1 多線程的定義及生成
3.1.1 多線程的定義
向項目中加入threads.cpp文件,在該文件中寫入通信線程和計算線程的控制函數(shù)。
控制函數(shù)有下面的原型:
  UINT MyThreadProc(LPVOID lpvThreadParam);
lpvThreadParam參數(shù)是32位的值,這個值就是在線程對象產生時傳遞給線程構造函數(shù)的參數(shù)。控制函數(shù)能解釋此值的不同表現(xiàn)方式。它可以被當作一個普通變量對待,也可以被視為一個指向包含有多個參數(shù)的結構指針,也可以被忽略。如果參數(shù)指向一個結構,這個結構可能不僅僅用來從調用者傳遞參數(shù)給線程,還可能用來從線程回傳數(shù)據(jù)給調用者。如果使用這樣的結構回傳給調用者,結果準備好后線程需要通知調用者。
控制函數(shù)終止時,應該返回一個UINT類型的值,表明終止的原因。返回碼0表示成功,其它值表示不同類型的錯誤,這完全依賴實現(xiàn)情況。
按一般程序示例,線程通常在視類或框架窗口類中產生。但在工控程序中,通信與計算線程常常要大量地對計算數(shù)據(jù)進行操作,根據(jù)文檔/視的程序框架結構,文檔類常常用來存儲所要處理的數(shù)據(jù)。因此把計算與通信線程放在文檔類中產生,并把產生線程的當前文檔對象的指針作為線程控制函數(shù)的參數(shù)傳遞給線程。
從而,在控制函數(shù)(CalcThreadProc ()和CommThreadProc())一開始,就要對所傳來的參數(shù)進行識別:
  CCtrsysDoc* pDoc = (CCtrsysDoc*)pParam;
注意要在文件開頭包括進文檔類的頭文件
  #include ″CtrsysDoc.h″
3.1.2  多線程的產生
  在文檔類的構造函數(shù)中產生線程。程序啟動時生成文檔對象,同時啟動兩個線程。
    ////////////////////////////////////
    // CCtrsysDoc construction/destruction
CCtrsysDoc::CCtrsysDoc()
{
    ……
    m_pCalcThread=AfxBeginThread(CalcThreadProc, this);
    m_pCommThread=AfxBeginThread(CommThreadProc, this);
}
    注意不要用Win32的CreateThread()建立線程,而應該用AfxBeginThread()函數(shù),否則所建立的線程不能訪問其它MFC對象。
3.2 線程間的同步
程序中設置有八個事件用于線程同步:
    HANDLE m_hEventPost;             //用來允許通信線程向主框架  
    發(fā)送WM_USER_COMM_NOTIFY消息
    HANDLE m_hEventStartCalc;        //主框架通知計算線程開始計算
    HANDLE m_hEventCalcStarted;      //計算線程通知主框架計算已經開始
    HANDLE m_hEventStopCalc;         //主框架通知計算線程中止計算
    HANDLE m_hEventCalcStopped;      //計算線程通知主框架計算已經中止
    HANDLE m_hEventCalcDone;         //計算線程通知主框架計算已經結束
    HANDLE m_hEventUpdateSourceData; //主框架通知計算線程更新數(shù)據(jù)
    HANDLE m_hEventSourceDataUpdated; //通信線程通知主框架數(shù)據(jù)已更新完畢
    這八個事件是主線程和兩個子線程之間同步所必需的,讀者可根據(jù)自己程序的需要另行添加。
因各線程都以文檔對象指針為參數(shù),這些事件都在文檔類頭文件中定義,這些事件在文檔類的構造函數(shù)中生成并賦初值。
CCtrsysDoc::CCtrsysDoc()
{
    ……
    m_hEventPost=CreateEvent(NULL,TRUE,TRUE, NULL);
    m_hEventCalcDone=CreateEvent(NULL,TRUE,F(xiàn)ALSE, NULL);
    m_hEventCalcStarted=CreateEvent(NULL,TRUE,F(xiàn)ALSE,NULL);
    m_hEventStartCalc=CreateEvent(NULL, TRUE,F(xiàn)ALSE, NULL);
    m_hEventSourceDataUpdated=CreateEvent(NULL,TRUE,F(xiàn)ALSE, NULL);
    m_hEventUpdateSourceData=CreateEvent(NULL,TRUE,F(xiàn)ALSE, NULL);
    m_hEventCalcStopped=CreateEvent(NULL,TRUE,F(xiàn)ALSE, NULL);
    m_hEventStopCalc=CreateEvent(NULL, TRUE,F(xiàn)ALSE, NULL);
    ……
}
線程的同步工作主要在主框架CMainFrame類的WM_USER_COMM_NOTIFY消息響應函數(shù)OnCommNotify中進行。當下方通信設備參數(shù)改變時,通信線程發(fā)送給CMainFrame類一個WM_USER_COMM_NOTIFY消息。CMainFrame類接收到消息后,在消息響應函數(shù)OnCommNotify中終止計算線程的當前計算,計算成功終止后由通信線程更新計算所需的數(shù)據(jù)源,待更新完畢后,重新開始計算。線程同步部分流程如圖2。

3.3 通信線程
通信線程部分流程如圖3所示。

3.4 計算線程
編程者應根據(jù)數(shù)據(jù)處理過程,在運算量較大或循環(huán)次數(shù)較多的地方設置對m_hEventStopCalc事件的查詢。當數(shù)據(jù)發(fā)生更新時,使用其它線程類型和同步方法往往必須等到數(shù)據(jù)處理部分結束,這樣整個一次數(shù)據(jù)處理都是無用計算;而采用上述方法,因數(shù)據(jù)更新所造成的無用計算僅僅是一步循環(huán)或幾行指令,相比而言,所導致的延時和CPU浪費是微不足道的。
計算線程部分流程如圖4所示。
本文地址:http://m.qingdxww.cn/thread-2586-1-1.html     【打印本頁】

本站部分文章為轉載或網友發(fā)布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據(jù)著作權人的要求,第一時間更正或刪除。
freeboy898 發(fā)表于 2011-11-4 14:48:17
大體的流程知道了,能再講詳細點就好了,學習了,謝謝樓主分享!
rewwen 發(fā)表于 2012-8-1 18:58:44
謝謝學習了。。。。。。
daizhi1970 發(fā)表于 2012-8-1 20:58:14
O(∩_∩)O謝謝
daizhi1970 發(fā)表于 2012-8-1 20:58:24
O(∩_∩)O謝謝
daizhi1970 發(fā)表于 2012-8-1 20:58:29
O(∩_∩)O謝謝
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發(fā)培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區(qū)

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕乱码人成乱码在线视频 | h在线免费观看 | 午夜网站免费版在线观看 | 七月婷婷在线网址 | 亚洲六月婷婷 | 在线观看免费av网 | 中文字幕日韩一区二区 | 在线观看国内自拍 | 日韩高清在线不卡 | 国产欧美日韩高清专区手机版 | 国产黄色小视频 | 伊人网欧美| 免费看的动漫网站 | 亚洲毛片在线 | 人人爰人人人人人鲁 | 国产高清视频91 | 国产成人一区二区三区免费观看 | 狠狠色依依成人婷婷九月 | 黄色在线观看国产 | 亚洲欧美自拍一区 | 九色在线免费观看 | 好吊色青青青国产欧美日韩 | a在线观看免费 | 99久久国内精品成人免费 | 公开免费视频 | 欧美综合在线观看 | 亚洲欧美日韩久久精品第一区 | 一级做a爰性色毛片免费 | 91最新在线播放 | 最新版天堂资源中文下载 | 免费jjzz在在线播放国产 | 两性影院| 91高清完整版在线观看 | 日韩久久精品一区二区三区 | 麻豆精品一区 | 国产自制一区 | 日韩黄色中文字幕 | 欧美国产在线视频 | 天天干在线免费视频 | 成视频年人黄网站免费动漫 | 久操操操|