亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

[連載]《C#通訊(串口和網絡)框架的設計與實現》-8.總體控制器的設計

2019-11-14 13:42:26
字體:
來源:轉載
供稿:網友

目       錄

第八章           總體控制器的設計... 2

8.1           總控制器的職能... 2

8.2           組裝和釋放部件... 3

8.3           事件響應... 5

8.4           小結... 9

 

第八章     總體控制器的設計

    有了IO部分、設備驅動部分、顯示部分、數據導出部分和服務組件部分等,在這些已經存在的接口上構建一個集成各部分的總控制器,協調各部分有序工作、事件響應和控制數據流向。

    另外,這個總控制器還負責與宿主程序進行交互,可以這樣理解:總控制器是宿主程序與IO部分、設備驅動部分、顯示部分、數據導出部分和服務組件部分之間交互的載體,并且是唯一的。結構示意圖如下:

 

8.1    總控制器的職能

   總控制器(IDeviceController)的職能包括:增加和刪除設備驅動、增加導出數據實例、增加圖形顯示實例、增加服務組件實例、單擊服務事件、釋放控制器資源等等。接口定義如下圖:

 

8.2    組裝和釋放部件

     DeviceController是總控制器的實例體類,繼承自IDeviceController接口。通過構造函數來完成對總控制器的初始化,代碼如下:

public DeviceController(){       _devList = DeviceManager.GetInstance();       _ioController = IOControllerManager.GetInstance();       _runContainer = RunContainerForm.GetRunContainer();       _runContainer.MouseRightContextMenuHandler += RunContainer_MouseRightContextMenuHandler;       _dataShowController = new GraphiCSShowController();       _exportController = new ExportDataController();       _appServiceManager = new AppServiceManager();}

   通過ReleaseDeviceController接口來完成對總控制器的資源釋放,代碼如下:

public void ReleaseDeviceController(){       _ioController.RemoveAllController();       _runContainer.RemoveAllDevice();       _runContainer.MouseRightContextMenuHandler -= RunContainer_MouseRightContextMenuHandler;       _exportController.RemoveAll();       _dataShowController.RemoveAll();       _appServiceManager.RemoveAll();       IEnumerator<IRunDevice> devList = _devList.GetEnumerator();       while (devList.MoveNext())       {              devList.Current.ExitDevice();       }       _devList.RemoveAllDevice();}

     軟件退出時釋放資源要比軟件啟動時加載資源要復雜的多,這塊涉及到兩方面問題:(1)釋放資源順序,如果資源提前釋放,那么往往會造成后邊代碼在執行過程中出現無法引用對象資源的現象,造成意想不到的結果,所以一定要對實例的可用性進行判斷。(2)事務性的線程無法正常退出,造成軟件界面已經關閉,但是后臺進程卻一直存在。特別是對線程退出的處理,框架平臺采用了統一的線程退出機制,代碼如下:

public void StartThead(){       if (_RunThread == null || !_RunThread.IsAlive)       {              this._IsExit = false;              this._RunThread = new Thread(new ThreadStart(RunThead));              this._RunThread.IsBackground = true; //該線程為后臺線程              this._RunThread.Name = "RunThread";              this._RunThread.Start();       }}PRivate void RunThead(){       while (!_IsExit)       {              if(_IsExit)         //如果標識為true,則退出循環,退出線程              {                     break;              }              //事務處理       }}public void StopThead(){       if (this._RunThread != null && this._RunThread.IsAlive)       {              this._IsExit = true;       //標識當前線程為可退出線程。              this._RunThread.Join(1000);//阻塞調用線程,直到某個線程終止或經過了指定時間為止              try              {                     _RunThread.Abort();    //為了防止線程沒有退出,進行強行終止,有可能造成文件損壞              }              catch              {              }       }}

8.3    事件響應

     增加和刪除設備驅動都會對設備的事件進行綁定和解綁。代碼如下:

dev.DeviceRuningLogHandler += new DeviceRuningLogHandler(DeviceRuningLogHandler);dev.UpdateContainerHandler += new UpdateContainerHandler(UpdateContainerHandler);dev.DeviceObjectChangedHandler += new DeviceObjectChangedHandler(DeviceObjectChangedHandler);dev.ReceiveDataHandler += new ReceiveDataHandler(ReceiveDataHandler);dev.SendDataHandler += new SendDataHandler(SendDataHandler);dev.COMParameterExchangeHandler += new COMParameterExchangeHandler(COMParameterExchangeHandler);dev.DeleteDeviceHandler += new DeleteDeviceHandler(DeleteDeviceHandler);

     具體含義請參見《第3章 設備驅動的設計》中的“3.12 事件響應設計”,COMParameterExchangeHandler改變串口參數事件響應代碼如下:

private void COMParameterExchangeHandler(object source, COMParameterExchangeArgs e){       if (e == null)       {              return;       }       IRunDevice dev = this._devList.GetDevice(e.DeviceID.ToString());       if (dev != null)       {              if (dev.CommunicationType == CommunicationType.COM)              {                     if (e.OldCOM != e.NewCOM)                     {                            //--------------對舊串口進行處理----------------//                            IRunDevice[] oldCOMDevList = this._devList.GetDevices(e.OldCOM.ToString(), CommunicationType.COM);                            //---------------檢測當前串口設備數------------//                            int existCOMCount = 0;                            for (int i = 0; i < oldCOMDevList.Length; i++)                            {                                   if (oldCOMDevList[i].GetHashCode() != dev.GetHashCode())                                   {                                          existCOMCount++;                                   }                            }                            //------------------------------------------//                            if (existCOMCount <= 0)//該串口沒有可用的設備                            {                                   IIOController oldCOMController = IOControllerManager.GetInstance().GetController(sessionCom.FormatKey(e.OldCOM));                                   if (oldCOMController != null)                                   {                                          _ioController.CloseController(oldCOMController.Key);                                   }                                   else                                   {                                          DeviceMonitorLog.WriteLog(e.DeviceName, "該設備的串口控制器為空");                                   }                            }                            //--------------對新串口進行處理----------------//                            bool newCOMControllerExist = IOControllerManager.GetInstance().ContainController(SessionCom.FormatKey(e.NewCOM));                            if (!newCOMControllerExist)                            {                                   IIOController newCOMController = _ioController.BuildController(e.NewCOM.ToString(), e.NewBaud.ToString(), CommunicationType.COM);                                   if (newCOMController != null)                                   {                                          newCOMController.StartService();                                        _ioController.AddController(newCOMController.Key.ToString(), newCOMController);                                   }                                   else                                   {                                          DeviceMonitorLog.WriteLog(e.DeviceName, "創建該設備的串口控制器失敗");                                   }                            }                            DeviceMonitorLog.WriteLog(e.DeviceName, String.Format("串口從{0}改為{1}", e.OldCOM.ToString(), e.NewCOM.ToString()));                     }                     else                     {                            if (e.OldBaud != e.NewBaud)                            {                                   ISessionCom comIO = (ISessionCom)SessionComManager.GetInstance().GetIO(SessionCom.FormatKey(e.OldCOM));                                   if (comIO != null)                                   {                                          bool success = comIO.IOSettings(e.NewBaud);                                          if (success)                                          {                                                 DeviceMonitorLog.WriteLog(e.DeviceName, String.Format("串口{0}的波特率從{1}改為{2}成功", e.OldCOM.ToString(), e.OldBaud.ToString(), e.NewBaud.ToString()));                                          }                                          else                                          {                                                 DeviceMonitorLog.WriteLog(e.DeviceName, String.Format("串口 {0} 的波特率從 {1} 改為 {2} 失敗", e.OldCOM.ToString(), e.OldBaud.ToString(), e.NewBaud.ToString()));                                          }                                   }                            }                     }              }              else              {                     DeviceMonitorLog.WriteLog(e.DeviceName, "不是串口類型的設備");              }       }}

    同時,還包括GraphicsShowClosedHandler和MouseRightContextMenuHandler兩個事件。當關閉顯示視圖的時候會觸發GraphicsShowClosedHandler事件,把當前視圖從管理器中移除,并釋放資源;當右鍵單擊顯示視圖會觸發MouseRightContextMenuHandler事件,以調用相應設備的上下文菜單。

8.4    小結

    總體控制器不是必須的,宿主程序完全可以直接與IO部分、設備驅動部分、顯示部分、數據導出部分和服務組件部分進行交互。但是,為了結構清晰、方便擴展,在中間加了一層進行總體協調。

 

作者:唯笑志在

Email:504547114@QQ.com

QQ:504547114

.NET開發技術聯盟:54256083

文檔下載:http://pan.baidu.com/s/1pJ7lZWf

官方網址:http://www.bmpj.net


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩亚洲精品电影| 亚洲一区二区三区毛片| 欧美黑人巨大精品一区二区| 久久成人精品视频| 日韩av毛片网| 亚洲伊人久久大香线蕉av| 美乳少妇欧美精品| 亚洲一区二区三| 欧美精品日韩www.p站| 国产一区二区三区四区福利| 亚洲一区美女视频在线观看免费| 激情亚洲一区二区三区四区| 欧美成人小视频| 亲子乱一区二区三区电影| 欧美日韩免费区域视频在线观看| 亚洲一区二区三区乱码aⅴ| 亚洲成人精品在线| 亚洲人永久免费| 韩国三级日本三级少妇99| 高跟丝袜一区二区三区| xxav国产精品美女主播| 亚洲成年网站在线观看| 中文字幕欧美专区| 成人黄色中文字幕| 伊人久久大香线蕉av一区二区| 狠狠久久五月精品中文字幕| 96精品视频在线| 国产精品一区二区三区毛片淫片| 国内精品一区二区三区| 久久久久久午夜| 国产欧美日韩中文| 亚洲国产美女精品久久久久∴| 日本欧美黄网站| 日韩电影在线观看免费| 日韩电影免费在线观看中文字幕| 中文字幕欧美亚洲| 最近2019年中文视频免费在线观看| 国内精品一区二区三区| 国产精品高潮呻吟视频| 91高清视频在线免费观看| 亚洲欧美在线一区二区| 中文日韩在线视频| 色婷婷亚洲mv天堂mv在影片| 欧美国产第一页| 国产成人av在线| 日韩av免费看| 97国产suv精品一区二区62| 欧美性猛交视频| 亚洲成**性毛茸茸| 欧美日韩高清区| 中文字幕精品一区久久久久| 欧美激情精品在线| 欧美一级黑人aaaaaaa做受| 成人国产精品日本在线| 亚洲综合精品伊人久久| 国产日韩欧美影视| 国产成人精品久久二区二区| 日本一欧美一欧美一亚洲视频| 日韩av在线电影网| 欧美大片在线免费观看| 欧美激情一区二区三级高清视频| 一区二区三区四区在线观看视频| 国产一区二区成人| 欧美午夜电影在线| 精品国产91久久久久久老师| 最新亚洲国产精品| 北条麻妃99精品青青久久| 国产精品老牛影院在线观看| 日韩成人在线播放| 亚洲国产97在线精品一区| 国产女同一区二区| 17婷婷久久www| 欧美猛交免费看| 日韩av日韩在线观看| 亚洲精品自在久久| 欧美在线精品免播放器视频| 午夜精品一区二区三区在线视| 成人免费观看a| 97av在线影院| 国产精品美女免费| 欧美性xxxx极品hd欧美风情| 琪琪亚洲精品午夜在线| 亚洲二区在线播放视频| 欧美激情视频在线观看| 国产精品久久77777| 精品激情国产视频| 久久久久久久一| 国产亚洲人成网站在线观看| 国产日韩欧美91| 日韩欧美国产黄色| 日韩精品在线观看一区| 亚洲人高潮女人毛茸茸| 日韩欧美成人免费视频| 欧美老妇交乱视频| 日韩精品黄色网| 国产精品av免费在线观看| 欧美丰满少妇xxxxx做受| 91性高湖久久久久久久久_久久99| 欧美中文字幕在线播放| 国产精品网站大全| 日韩不卡中文字幕| 成人国产精品一区二区| 亚洲欧美色婷婷| 国产精品久久久av久久久| 欧美激情国产精品| 国产精品最新在线观看| www.欧美三级电影.com| 欧美在线视频免费播放| 国产精品久久久久久av下载红粉| 成人黄色短视频在线观看| 91精品国产精品| 精品视频久久久久久| 久久久久久成人精品| 色妞在线综合亚洲欧美| 欧美性猛交xxxx免费看| 亚洲天天在线日亚洲洲精| 成人黄色短视频在线观看| 亚洲福利视频网站| 国产精品美女免费视频| 亚洲国产精品久久久| 亚洲天堂影视av| 欧美电影免费观看大全| 国内精品久久久久影院 日本资源| 日韩一区二区在线视频| 欧美激情精品久久久久久黑人| 亚洲免费伊人电影在线观看av| 国产精品电影观看| 成人av在线网址| 中文字幕无线精品亚洲乱码一区| 亚洲一区二区精品| 亚洲图片欧美日产| 国产亚洲欧洲高清一区| 国产成人免费91av在线| 欧美最猛性xxxx| 亚洲第一级黄色片| 亚洲自拍另类欧美丝袜| 久久偷看各类女兵18女厕嘘嘘| 在线日韩日本国产亚洲| 久久精品国产欧美亚洲人人爽| 中文一区二区视频| 国产日韩精品综合网站| 欧美精品18videos性欧美| 亚洲成人性视频| 少妇激情综合网| 国产美女精品免费电影| 亚洲www永久成人夜色| 91欧美精品午夜性色福利在线| 欧美精品videosex极品1| 91国自产精品中文字幕亚洲| 精品国产视频在线| 欧美视频第一页| 色多多国产成人永久免费网站| 国产福利成人在线| 亚洲精品视频播放| 欧美激情久久久久久| 国产精品热视频| 欧美激情视频给我| 国产免费亚洲高清| 国产美女久久久| 在线播放亚洲激情| 久久久久国产精品免费| 国产精品入口夜色视频大尺度| 国产亚洲欧洲高清| 国产日韩欧美在线观看|