当前位置:编程学习 > C#/ASP.NET >>

多点监控,催碎式设计, 多线程,如何改进现有的设计模式 caozhy,sp1234

这个问题,源自于一网友发的帖子,后面是帖子的地址 http://topic.csdn.net/u/20120116/14/d42cc367-ff8b-436b-a561-3c990df08bfe.html

其中caozhy说,“没有做过大项目不要去误导别人”,说实话以前没有想过这个问题,就想论坛嘛,把你知道的告诉别人就完事,现在看来不是这样,是我错了。因为你的错误的回答会左右别人的思维。言归正传:

公司经常会接到这样的项目,酒店的空调管理啊,超市的照明管理啊,等等。我们都用了同一种软件设计,现把主要的代码公布如下:
MDI,主窗体代码:

        public delegate void ValueChangedReceivedEventHandler();

        public void ValueChanged()
        {
            if (this.InvokeRequired)
            {
                if (ScanThread.isStarted)
                {
                    try
                    {
                        this.Invoke(new ValueChangedReceivedEventHandler(ValueChanged));
                    }
                    catch (Exception ex)
                    {
                        //return;
                    }

                }
            }
           else
            {
               //此处处理ScanThread线程的扫描结果(结果是通过一个全局变量数组传过来的)
            }


其中ScanThread的主要代码如下:


private frmMain _frmMain = null;
private MethodInvoker frmMainChange;
        public ScanThread(frmMain f)
        {
            _frmMain = f;
            frmMainChange = new MethodInvoker(_frmMain.ValueChanged);
        }
        public void ThreadRun()
        {
          //里面的代码就是sp1234在上一个帖子中提到的“催碎式设计”,每隔一毫秒去扫描一次所有监控点的状态得到一个数组,跟主窗体共享这个全局数组变量
          
          frmMainChange.BeginInvoke(null, null);
        }


以前在网上也有人问过我同样的问题,我就是这样把自己的源代码给了别人,现在看来我误导别人了,所以在此请教大家,我应该如何改进或重新设计自己的软件架构。

注:我们下位机通讯一般是RS232,485, modbus,OPC等,下位机都是被动式(不发送询问命令,是没有返回值的,发送一次,返回一次) --------------------编程问答-------------------- --------------------编程问答-------------------- 这个真不懂,等大神了 --------------------编程问答-------------------- 我看了下原帖,我觉得这要看实际的项目的经费条件和硬件环境,
比如,如果允许增加少量的预算,我会采用多级控制的形式,把所谓"轮询"的任务交由硬件层来代理
--------------------编程问答--------------------
引用楼主 ttiimm11 的回复:
以前在网上也有人问过我同样的问题,我就是这样把自己的源代码给了别人,现在看来我误导别人了,所以在此请教大家,我应该如何改进或重新设计自己的软件架构。


看了原帖。


是的 你误导了。

设计这类型的软件架构有两种情况:
1. 已有固定的硬件:根据硬件去设计。
2. 已有固定资金: 根据固定资金去设计硬件和软件。

不然都是徒劳。 --------------------编程问答--------------------
引用 3 楼 microtry 的回复:
我看了下原帖,我觉得这要看实际的项目的经费条件和硬件环境,
比如,如果允许增加少量的预算,我会采用多级控制的形式,把所谓"轮询"的任务交由硬件层来代理


是了 就是这样。 --------------------编程问答--------------------
引用 2 楼 q263510130 的回复:
这个真不懂,等大神了


我也不懂,一起学习 --------------------编程问答--------------------
引用 3 楼 microtry 的回复:
我看了下原帖,我觉得这要看实际的项目的经费条件和硬件环境,
比如,如果允许增加少量的预算,我会采用多级控制的形式,把所谓"轮询"的任务交由硬件层来代理

这个跟原帖没有多大关系,跟钱更没关系。
我们假定,下位机是个PLC,RS232通讯方式,那个“轮询”也就是sp1234说的催碎式方式,如何去改进? --------------------编程问答-------------------- 请教大家,特别是sp1234如何去改进这个催碎式的设计?
假定,下位机是个PLC,RS232通讯方式 --------------------编程问答--------------------
引用 8 楼 ttiimm11 的回复:
请教大家,特别是sp1234如何去改进这个催碎式的设计?
假定,下位机是个PLC,RS232通讯方式


误会了,才发现原帖lz与现在lz不是同一个人,语出不逊了,抱歉先
既然是用RS232了,且不希望是轮询方式,可以利用PLC去组织信号格式,主动发送消息。
如果下位机主动发送消息,可能会有消息丢失或发送失败的可能性,一般的,还需校验和唤起重新发送机制。
C#的SerialPort还有非阻塞异步处理的预设,利用这个去写事件派发与处理应该是可以的吧。

不甚了解,等结果。
--------------------编程问答--------------------
引用 9 楼 sunzongbao2007 的回复:

楼主已经说了,下位机是被动的,
我也已经说了,如果终端设备不能变动,那么增加中间层,用硬件轮询,
而且对于楼宇级别的监控系统,我们一般都采用多级控制方案,
很难想像,中心控制室的触控屏上,直接显示成百上千个监控的点是什么效果,
一定是按区域,分楼层控制和管理的,硬件设备也按照相同的组织原则去堆叠,职责就被分担到这些不同的硬件层,我不太会考虑直接用服务器去轮询每个终端,而是让中间硬件向服务器报告状态变化 --------------------编程问答-------------------- 同意10楼,通常我们采用隔离设计。软件系统并不主动负责与硬件系统沟通。他们中间应该有一些分布式的数据采集层做沟通。

软件本身就只在需要的时候访问一下采集层(如果是做监控,一般还是反过来,由数据采集层发送状态变更信息触发软件系统变更显示)

实际上支持 BACnet协议的中间控制采集设备还是很多滴 --------------------编程问答--------------------
引用 10 楼 microtry 的回复:
引用 9 楼 sunzongbao2007 的回复:

直接显示成百上千个监控的点是什么效果,


哈哈,我从最初的说起了,不是改进方案。
我也同意你的想法。
如果监控不是必须的同时显示成百上千的监控点信息,按需轮询是个非常好的做法。

同意,顶起。 --------------------编程问答-------------------- 10楼说的对,但目前我们没有这样的硬件环境。我们也是采用的类似于你说的“多级控制方案”,也不会同时显示成百上千个监控点的信息。

11楼也一样,我们现在没有所谓的数据采集层,数据的采集都是通过软件来完成的。

12楼提到一个“按需轮询”,换汤不换药,没有改进所谓的“催碎式设计”是吗?用户现在要显示酒店一楼某个房间的空调设置温度,你的意思,我现在只要“轮询”该房间的空调?那如果二楼的某个房间的空调有报警,怎么办(有报警的话,软件要有提示,这是客户的需求,但,我们不去“轮询”二楼的所有空调,我们就不知道有报警,下位机是被动的,不问它,它就不回答,没有11楼的哥们的数据采集,也没有设备去触发) --------------------编程问答-------------------- 这里的按需就是分组。用一个树形结构去组织硬件。
比如 A { A1,A2 }这是两栋楼, A1{ B1,B2,B3} A2{B1,B2,B3}

消息逐层向上返。这个意思跟10楼的多级控制是一个意思,不然我也不会顶他了。 --------------------编程问答--------------------
引用 14 楼 sunzongbao2007 的回复:
这里的按需就是分组。用一个树形结构去组织硬件。
比如 A { A1,A2 }这是两栋楼, A1{ B1,B2,B3} A2{B1,B2,B3}

消息逐层向上返。这个意思跟10楼的多级控制是一个意思,不然我也不会顶他了。

有道理,有待改进 --------------------编程问答-------------------- caozhy,sp1234两位出来指教一下呗,
问题太简单,不值得?
分太少?
--------------------编程问答--------------------

一毫秒去扫描一次所有监控点,行的通吗? --------------------编程问答--------------------
引用 17 楼 startstartsvip 的回复:
一毫秒去扫描一次所有监控点,行的通吗?

哪方面行不通? --------------------编程问答-------------------- 顶上去

诚心求教中...... --------------------编程问答--------------------
引用 16 楼 ttiimm11 的回复:
caozhy,sp1234两位出来指教一下呗,
问题太简单,不值得?
分太少?

 大过年的你让人家出来回答你的问题。。。你怎么不直接问他本人呢? --------------------编程问答-------------------- 看了半天没看明白这种“催碎式”有什么问题,如果没问题为什么要改呢。有问题的话是轮询延时太长还是其他的什么问题? --------------------编程问答--------------------
引用 20 楼 wjfwd2010 的回复:
 大过年的你让人家出来回答你的问题。。。你怎么不直接问他本人呢?


看他们在线,才问的问题,了解?
问他本人,你有他电话啊?
 别把话题扯到程序以外, OK? --------------------编程问答--------------------
引用 21 楼 zhangning111 的回复:
看了半天没看明白这种“催碎式”有什么问题,如果没问题为什么要改呢。有问题的话是轮询延时太长还是其他的什么问题?

caozhy说我误导别人,sp1234说,这样的设计是表面喜欢编程的小白,我才开贴请教的。因为他们的等级都比我高,所以他们的水平肯定在我之上,活到老,学到老嘛。

--------------------编程问答--------------------  我查。。。。 没有看懂。。。。 --------------------编程问答-------------------- 我个人觉得,如果监控的对象不自动发布消息,不适用碎催式的使用什么呢? --------------------编程问答-------------------- 先不管是否碎催设计,这个方式是可以用的,但从组件调用角度考虑,也可以进行些改进:
首先看到状态轮询部分的代码是后台业务处理部分,而数据显示部分是前台界面部分,我们一般很希望组件引用时由界面组件引用业务组件,而不是相反(如果两部分代码是放在一起的一个组件,就当我放屁好了)。
这时就很希望能把委托public delegate void ValueChangedReceivedEventHandler();放到业务组件去,(同时需要夹带数据上去)。业务组件在轮询时发现有需要界面处理的数据时调用一个变更事件ValueChange(data)即可。如果按多线程处理可以ValueChanged.BeginInvoke();
而界面组件注册了业务组件的ValueChanged事件处理方法,被激发即可按照你的方式处理了。这样就实现了组件调用关系分离。


--------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,