做一个给予者,才是实在的成功之路

目       录

管理 1

第四章           设备驱动管理器的设计… 2

1

4.1           接口定义… 2

“Things are dead.”

4.2           设备容器… 7

布莱恩博士,站在自我的先头,脱出手腕的手表,一字一顿地吐出那三个词,THINGS
ARE DEAD.

4.3           生成设备ID.. 7

“Things do not make us happier.”大学生随即说道, “You can’t talk to it
,you can’t make love with it. ”

4.4           对配备容器操作的互斥… 8

每当回忆起这么些画面,我的泪水就止不住地流下来。36年了,我都活着一个什么样的人生,for
those dead things?

4.5           获得装备列表… 8

ACTDP是布莱恩博士创始的生涯管理与美貌发展咨询师认证项目,这几个75岁老外祖父像圣诞老人一般降落到中国,卖掉米国的屋宇,取出自己的养老金,在神州折腾了8年,终于有空子让一群对生涯感兴趣的炎黄青春人们听到了他极大浩繁的诊治生涯咨询理论连串,并让我们亲眼目睹他行云流水般的咨询进程。

4.6           设备计数器的尤其用处… 8

她说她赶到中国的重任是,可以激励越来越多中国的年青人找到自己,培育越来越多业内的生计教练,也同时有利于于中国的铺面生涯率领,推进生涯在中华的迈入。而自己有幸成为了博士筑梦途中的同行者。

4.7           小结… 10

管理,2

 

始发博士说的那席话,让自身既喜悦又郁郁寡欢。一个在我眼里Bethune先生的真人版,距离自己只有一米都不到,75岁的他即使满头白发,蹒跚而行,然而眼神和声音却照样那样坚决。

第四章     设备驱动管理器的规划

   
设备驱动管理器是对IRunDevice设备驱动接口的军事管制,是框架主要的组成部分之一。不管设备驱动管理器怎么规划、以怎么着形式存在,在概念上肯定是存在的。设计好的设施驱动管理器对于框架平台的稳定性运行至关主要。

  
在介绍装备驱动管理器从前,先不难介绍一下IO控制器(IIOController),它根本担负对IO和配备举行调度,并驱动装置运行,在《第5章
串口和互联网的IO设计》举行详细的介绍。也就是说一个IO控制器可能会对应多个装备驱动(插件)。

  
早期的时候,每个IO控制器都有一个配备驱动管理器。在框架平台启动的时候,依据设备驱动的简报参数把相应的设施驱动分配到对应的IO管理器;当IO参数暴发变化的时候,会接触事件,把该设备驱动从眼前IO控制器移动到另一个IO控制器。

  
从事情角度来考虑,那样做并从未什么样难点,并且直接运转的很稳定。不过,从模块化、扩充性角度来设想,不是太理想,若是在其他地方调用某一个配备驱动时,不可以直接、很快的找到该设备驱动,必要遍历IO控制器再协作相应的设备驱动,并且操作麻烦以及效用不高。

  
在对框架平台举行重构的时候,把该难点进行了重新考虑,并把相关联的题材一并解决。把种种IO控制器中的设备驱动管理器举行了整合,用一个设备驱动管理器来完结框架平台的调和工作。

  
这块涉及到的技能并不难,也很不难精晓,不过在筹划进程中需求小心一些细节难点,那一个标题或者影响框架平台的安定。

本人成本了几年初于可以坦然面对自己对成就的期盼,然则那几个渴望竟然如此苍白,如此无力,拿过的奖状,领过的水晶杯,公布过的稿子或者做过的解说,我猛然觉得,我的世界正在轰然倒下。

4.1    接口定义

    先定义一个接口(IDeviceManager<TKey,
电视机alue>),确定设备驱动管理器都要马到功成什么出力,扩展设备、删除设备、获得装备和列表、以及其他的职能。接口代码如下:

public interface IDeviceManager<TKey, TValue> : IEnumerable<TValue> where TValue : IRunDevice
{
       /// <summary>
       /// 新建设备的ID,且唯一
       /// </summary>
       /// <returns></returns>
       string BuildDeviceID();

       /// <summary>
       /// 增加设备
       /// </summary>
       /// <param name="key"></param>
       /// <param name="val"></param>
       void AddDevice(TKey key, TValue val);

       /// <summary>
       /// 删除设备
       /// </summary>
       /// <param name="key"></param>
       void RemoveDevice(TKey key);

       /// <summary>
       /// 移除所有设备
       /// </summary>
       void RemoveAllDevice();

       /// <summary>
       /// 获得值集合
       /// </summary>
       /// <returns></returns>
       List<TValue> GetValues();

       /// <summary>
       /// 获得关键字集合
       /// </summary>
       /// <returns></returns>
       List<TKey> GetKeys();

       /// <summary>
       /// 获得设备的ID和名称
       /// </summary>
       /// <returns></returns>
       Dictionary<int, string> GetDeviceIDAndName();

       /// <summary>
       /// 获得高优先运行设备
       /// </summary>
       /// <param name="vals"></param>
       /// <returns></returns>
       TValue GetPriorityDevice(TValue[] vals);

       /// <summary>
       /// 获得单个设备
       /// </summary>
       /// <param name="key"></param>
       /// <returns></returns>
       TValue GetDevice(TKey key);

       /// <summary>
       /// 获得设备数组
       /// </summary>
       /// <param name="para">IP或串口号</param>
       /// <param name="ioType">通讯类型</param>
       /// <returns></returns>
       TValue[] GetDevices(string para, CommunicationType ioType);

       /// <summary>
       /// 获得指定IP和工作模式的网络设备
       /// </summary>
       /// <param name="remoteIP"></param>
       /// <param name="workMode"></param>
       /// <returns></returns>
       TValue[] GetDevices(string remoteIP, WorkMode workMode);

       /// <summary>
       /// 获得指定工作模式的网络设备
       /// </summary>
       /// <param name="workMode"></param>
       /// <returns></returns>
       TValue[] GetDevices(WorkMode workMode);

       /// <summary>
       /// 获得设备数组
       /// </summary>
       /// <param name="ioType"></param>
       /// <returns></returns>
       TValue[] GetDevices(CommunicationType ioType);

       /// <summary>
       /// 按设备类型获得设备
       /// </summary>
       /// <param name="devType"></param>
       /// <returns></returns>
       TValue[] GetDevices(Device.DeviceType devType);

       /// <summary>
       /// 判断设备是否存在
       /// </summary>
       /// <param name="key"></param>
       /// <returns></returns>
       bool ContainDevice(TKey key);

       /// <summary>
       /// 根据输入参数,判断是否包括设备
       /// </summary>
       /// <param name="para">IP或串口号</param>
       /// <param name="ioType">设备通讯类型</param>
       /// <returns></returns>
       bool ContainDevice(string para, CommunicationType ioType);

       /// <summary>
       /// 设置用户级别
       /// </summary>
       /// <param name="userlevel"></param>
       void SetUserLevel(UserLevel userlevel);

       /// <summary>
      /// 设置是否注册
       /// </summary>
       /// <param name="isreg"></param>
       void SetIsRegLicense(bool isreg);

       /// <summary>
       /// 获得可用设备数
       /// </summary>
       int Count { get; }

       /// <summary>
       /// 获得设备的计数器的值
       /// </summary>
       /// <param name="key"></param>
       ///<returns></returns>
       int GetCounter(TKey key);

       /// <summary>
       /// 设置计数器的值
       /// </summary>
       /// <param name="key"></param>
       /// <param name="val"></param>
       void SetCounter(TKey key, int val);
}

 4.2    设备容器

  
设备驱动管理器是对Dictionary<Key,Value>的包裹,Key是设备驱动的ID,Value是IRunDevice设备驱动接口。设备驱动管理器须求跨线程应用,所以对Dictionary操作要加线程同步锁。

   当时接纳的是.NET Framework 2.0框架,没有ConcurrentDictionary(Of TKey,
电视机alue)字典类,这么些类的装有公共和受有限支撑的积极分子都是线程安全的,使用原子性操作,适合五个线程之间同时使用。再重构时可以应用ConcurrentDictionary类代替Dictionary类,因为ConcurrentDictionary的保有操作使用到了Monitor线程同步类,不要求协调再拓展打包。

   不贴ConcurrentDictionary类的源代码了,具体使用参考MSDN。

在美利坚合众国以及全球很多地点有多少计算,当一个人要么一个家家的年收入超越一定数值,幸福感和受益增高就不再成正比。原来俺们大力奔到了温饱,却并不一定幸福。

4.3    生成设备ID

    查寻设备驱动管理器中最大的装备ID,并在此基础上加1。这块代码很粗略,

如下:

public string BuildDeviceID()
{
       if(_dic.Count>0)
       {
          int maxID=_dic.Max(d => d.Value.DeviceParameter.DeviceID);
          return (++maxID);
       }
       else
       {
              return 0;
       }
}

   
增添设备驱动是亟需变更设备ID,一般采用手动伸张设备驱动,所以在那块不须求加线程同步锁。

那什么才是当真的美满?

4.4    对设施容器操作的排挤

框架平台具有组件要共享设备驱动管理器,所以会提到到跨线程应用,更加

是当集合暴发改变的时候,可能会出现相当。例如:启动框架平台的时候,IO控制器已经启动,IO控制器从设备驱动管理器提取自己的装置列表,不过此时有可能还未曾加载完设备驱动,当有新的装备驱动扩充到设备驱动管理时,可能会引发争论。

   
所以,在追加设备、删除设备和收获装备列表的时候扩张了线程同步锁,例如:lock
(_SyncLock)。

3

4.5    得到装备列表

有多少个得到装备的构造函数(GetDevices),首如若知足分裂的接纳场景。

请参考“4.1接口定义”。

   
其它,获得高优先运行设备的GetPriorityDevice函数在上一章节早已介绍了。

马丁·塞利格曼是积极心思学的开山之一,在他的有名TED演讲《积极心情学的新时代》中,塞利格曼大学生提到了三种人生:

4.6    设备计数器的异样用途

    在接口定义中有SetCounter和GetCounter多个函数,用在报导过程中。

   
应用场景是那般的,在产出和约束通信格局中,设备驱动向来处于在简报正常的气象下,可是忽然发生线路中断或其余原因促成力不从心收到到数码时,那么设备驱动一贯不能接收到多少,也不知所可对通信状态举行检测以及变更相应的数码新闻,也就是说现实际情况状已经发出转移,但是设备驱动却不能获取响应。

   
为了防范那种景色的面世,设备驱动每回发送数据时,通过GetCounter函数获得当前配备驱动的计数器,对计数器(变量)+1操作,并透过SetCounter函数把计数器(变量)再写到设备驱动管理器中。在越发接收数据的时候,执行同样的流程,不过执行-1操作。借使直白发送数据,而尚未接到到多少时,当前设施驱动的计数器就会一贯在抬高。假使超出等于某个值的时候,就会通过RunIODevice(new
byte[]{})驱动当前装备,执行总体设施处理流程,二次开发的代码块就会被调用,来落成此类应用场景的图景改变和数量变化。代码如下:

int counter = DeviceManager.GetInstance().GetCounter(dev.DeviceParameter.DeviceID.ToString());
int sendNum = SessionSocketManager.GetInstance().Send(dev.DeviceParameter.NET.RemoteIP, data);
if (sendNum == data.Length && sendNum != 0)
{
       DeviceMonitorLog.WriteLog(dev.DeviceParameter.DeviceName, "发送请求数据");
       Interlocked.Increment(ref counter);
}
else
{
       Interlocked.Increment(ref counter);
       DeviceMonitorLog.WriteLog(dev.DeviceParameter.DeviceName, "尝试发送数据失败");
}
dev.ShowMonitorIOData(data, "发送");
if (counter >= 3)
{
       try
       {
              dev.RunIODevice(new byte[] { });
       }
       catch (Exception ex)
       {
              DeviceMonitorLog.WriteLog(dev.DeviceParameter.DeviceName, ex.Message);
              GeneralLog.WriteLog(ex);
       }
       Interlocked.Exchange(ref counter, 0);
}
DeviceManager.GetInstance().SetCounter(dev.DeviceParameter.DeviceID.ToString(), counter);

  
对于发送和接到数据会在差其余线程上形成,在对计数器(变量)进行+1和-1操作的时候使用到了Interlocked类,用于八个线程共享的变量提供原子操作,幸免在多处理器上并行操作时或许引发的相当或数量遭到破坏。

Pleasant life,愉悦的人生

4.7    小结

  
那样改造后,不仅能够在IO控制器对设备开展引用,也可以在其它零件使用。要是遇上类似的景观,希望选用ConcurrentDictionary类。

 

小编:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

文档下载:http://pan.baidu.com/s/1pJ7lZWf

法定网址:http://www.bmpj.net

Good life,出色的人生

Meaningful life,有含义的人生

而有意义的人生,指的就是人要设定一个比自己更大的对象并为之去全力(something
larger than you
are)什么是比自己更大(larger)的靶子,就是当先个人需求的目标,直接点儿,自己以外的都比自己更大!

当自家见状那句话的时候,忍不住会心一笑,大家中华夏族从未紧缺当先个人的社会构想,大家从小就浸润在老吾老以及人之老,幼吾幼以及人之幼的天伦中,在“后天下之忧而忧,后天下之乐而乐”地铁的美好中。

人人都背诵过的《钢铁是怎么炼成的》中的名句:人的终身应该那样度过:当一个人回首往事时,不因虚度年华而懊悔,也不因毫无作为而汗颜;那样,在他临死的时候,可以说,我把任何生命和任何生机都献给了人生最难得的事业——为人类的解放而努力。

4

原来那就是甜美丽的女孩子生。

俺们所仰慕的被西方”精致利己主义”者渲染的那么些“美好生活”画面,豪宅豪车,阳光沙滩,名包名表,美食霓裳,原来都不是确实的甜蜜,而“为庶人服务”,才是甜蜜的真理?社会学家,心思学家,还有大地的甜美指数报告,告诉大家,恐怕那回是真的。

咱俩已经手握幸福的奥秘,只是大家挑选不信。

当自家的社会风气哗然倒下未来,烟消云散,我算是看到了甜美的绝密,如同神话故事一样,那么些散了一地的砖头自己运动了起来,重新架构了一个社会风气,用的素材依然照旧原来的。只可是,改变了征途的取向。

因为Brian说,Success does not lead to happiness. It is happiness that
will lead us to success.

5

刚好,在另一位心境学家Adam
Grant的TED解说中,他用数字表明了,那个给予者,在不少商行,机构和团队中也是成功者,是绩效季军。Adam呼吁说,我们一块儿去共建一个让给予者成功的世界,因为成功的定义已经爆发了变更,不再是在竞争中胜出,而是看哪个人进献得越来越多。

子曰,给予立则立人,己欲达则达人。那是一个给予者的寓言,而现行她正在成为现实性。大家看看的是布莱恩硕士的义不容辞之旅,他辅导着我们每个人找到了温馨,而我辈也构建了她的生涯事业的企盼,那的确很神奇。

今儿早上是布莱恩大学生的75周岁生日,在一天的科目截止后,大家镇定自若地准备好了蛋糕和小礼物,大家望着他戴上了生日帽,吹灭了火炬,然则我们更清楚,他早就激起了我们心中的那支蜡烛,而我们的任务则是去激起更四人,那就是大家友好的幸福之路。

管理 2

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注