关于进程

之前我在启动我的师生对讲的exe的时候,都是直接调用Process类的静态函数Process.Start(System.String AppPath,System.String Arguments) 来直接启动一个exe,这样当然是可以的,但是当我们的进程退出或者意外崩溃的时候,却没有办法对这个进程进行相关的检测,也就是说如果进程中途退出了的话,可能会导致整个框架的互斥等状态未发生改变,这个时候就需要用到一个进程对象

也就是说我们可以先实例化一个进程的对象Process p_VideoMeet,然后再用这个进程p_VideoMeet来表示我们整个运行着的进程,也就不用再做一些没什么含义的启动检测啊,状态码之类的东西了。所以对于此,我在这里写一个相关的实例。

比如我现在一个类,LBD_VideoMeet类,我可能在这个类内启动两个进程之中的一个,之前我们在使用的时候,是直接通过Process.Start这个静态函数启动,然后记录其启动的状态,其实这样的调用容易导致一些混乱的状态,而且有可能程序的意外退出,如果崩溃的话就没法知道当前的进程状态了,没有通知的情况,会导致无法获得互斥状态,如果这样的话,就没法清除当前状态了。

那么现在来上实例。

假设我们现在可以获得两个程序,Intercom.exe和 Broadcast.exe的启动路径和启动参数,而且当我们启动的时候就会向我们的框架中发送句柄,那我们现在应该怎么做呢?

首先我们当然是希望打开的子进程不脱离我们的主进程,也就是我们在主进程中可以有完整的子进程,所以不能像野狗拉屎一样,把子进程拉出来放在大街上随风而去就完了(当然考虑到高内聚低耦合的原则,这肯定是最好的状态,打开的子进程有完整独立的功能,而需要整合其中的程序用dll来表示,但是开发中难免有些妥协,比如开源,或者跨语言的程序,或者像我这样的新手写dll没法保证内存和线程的安全性)

那我们就用一个进程来表示我们现在需要启动的进程 Process p_VideoMeet,因为Intercom和Broadcast是互斥的,所以两个共享一个进程类就行了,反正这个进程退出的时候也会释放掉所有的资源,所以不需要操心。甚至这样操作可以省去很多不必要的判别,直接释放进程类资源即可。

原先没有参悟到这个精髓写出来的大便现在再回过头来看真是令人羞愧,但是能跑告诉公路的大便,谁在乎他会不会有轮子呢?

我们先设置一个进程对象

 Process p_VideoMeet = null;

启动进程的方法:

 public void StartProcess(System.String strAppPath, System.String Argus)
{
try
{
if(this.p_VideoMeet == null)
{
p_VideoMeet = new Process();
} p_VideoMeet.StartInfo.FileName = strAppPath; //启动进程具体路径
p_VideoMeet.StartInfo.Arguments = Argus; //启动项参数
p_VideoMeet.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动
p_VideoMeet.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
p_VideoMeet.StartInfo.RedirectStandardOutput = false;//由调用程序获取输出信息
p_VideoMeet.StartInfo.RedirectStandardError = true;//重定向标准错误输出
p_VideoMeet.StartInfo.CreateNoWindow = false;//不显示程序窗口
p_VideoMeet.EnableRaisingEvents = true; //意外退出的话,我这边也可以得到消息了
p_VideoMeet.Exited += this.P_Exited; p_VideoMeet.Start(); }
catch (Exception e)
{
WriteErrorMessage("CheckClientExitMessages:" + e.Message); }
}

意外退出事件

public static event EventHandler ExitedEvent;

private static void P_Exited(object sender, EventArgs e)
{
if (ExitedEvent!=null)
{
ExitedEvent(sender,e);
}
}

最伟大的设计,就是最简单的设计。

关于事件和委托

其实我个人在开发过程中是比较抵触事件和委托这个叫法的,就有点像socket通讯里管socket叫套接字 这种翻译一样,即使到了我还是觉得所谓的套接字没有 发包 这两个字来的简介明了。

如果要换一种说法,我们要怎么理解呢?其实就像是触发器和接收器 -- 当我们按下触发器之后,所有的接收器都会接到触发器发送来的信号。打个比方,就好像烽火狼烟,我一点火,所有的哨站就知道开干了,这种情况下烽火只能传递一个简单信号:起火等于开干,但是这也是只有其他哨所才懂其中的含义;或者海上的灯塔,按照一定的频率和强度打信号,海上的渔船就能看得懂灯塔打来的信号,这样传递的信息就更加复杂了,这些传递的信息也只有这个海域的渔船们才会懂,不同的海域可能会有不同的约定俗成的信号模式。

C#的事件委托大致和我上面说的这两种模型差不多,都分为 1.触发器,即发送信号的方法 2.接收器,即接收到信号并触发行为的方法

之前我也有些过一篇博客,有关于事件和委托相关的内容的,详情见下方博客

轩先生-主框架代码中,关于委托的一些事,开发日志

C#中的进程检测退出事件和座位状态改变事件深入浅出谈谈EventHandler的使用的更多相关文章

  1. iOS:使用代理模式监听开关状态改变事件

    记一次解决跨控制器监听开关状态改变的尝试. 为了统一设置UITableViewCell里的内容,自定义了UITableViewCell类的一个基类,命名为SettingCell.SettingCell ...

  2. JS事件 文本框内容改变事件(onchange)通过改变文本框的内容来触发onchange事件,同时执行被调用的程序。

    文本框内容改变事件(onchange) 通过改变文本框的内容来触发onchange事件,同时执行被调用的程序. 如下代码,当用户将文本框内的文字改变后,弹出对话框"您改变了文本内容!&quo ...

  3. jQuery中的bind绑定事件与文本框改变事件的临时解决方法

    暂时没有想到什么好的解决办法,我现在加了个浏览器判断非ie的话就注册blur事件,这样有个问题就是blur实在别的控件活动焦点的时候,txtStation控件注册的方法是为了填充它紧挨着的一个下拉列表 ...

  4. JS监听input框的回车事件、属性值改变事件

    一.介绍 在程序猿门的工作中,经常会遇见一些表单数据的提交,对于有表单的东西而言,input输入框是非常常见的,所以对于一些input的基本事件,我们需要去掌握 二.input的监听enter事件 比 ...

  5. HTML5事件—visibilitychange 页面可见性改变事件

    转:https://blog.csdn.net/yusirxiaer/article/details/73480916 又看到一个很有意思的HTML5事件 visibilitychange事件是浏览器 ...

  6. 是什么在.NET程序关闭时阻碍进程的退出?

    在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源.这个现象有时并不容易被察觉,但在 ...

  7. linux进程解析--进程的退出及销毁

    一进程的退出: 当一个进程运行完毕或者因为触发系统异常而退出时,最终会调用到内核中的函数do_exit(),在do_exit()函数中会清理一些进程使用的文件描述符,会释放掉进程用户态使用的相关的物理 ...

  8. linux系统中的进程状态分析

    转载地址:https://blog.csdn.net/shenwansangz/article/details/51981459 linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序, ...

  9. silverlight属性改变事件通知

    工作中遇到silverlight本身没有提供的某些属性改变事件,但又需要在属性改变时得到通知,Google搬运stack overflow,原地址 /// Listen for change of t ...

  10. 1.2 Linux中的进程 --- fork、vfork、exec函数族、进程退出方式、守护进程等分析

    fork和vfork分析: 在fork还没有实现copy on write之前,Unix设计者很关心fork之后立即执行exec所造成的地址空间浪费,也就是拷贝进程地址空间时的效率问题,所以引入vfo ...

随机推荐

  1. Elasticsearch:如何实现对 emoji 表情符号进行搜索

    转摘自:https://elasticstack.blog.csdn.net/article/details/114261636 Elasticsearch 是一个应用非常广泛的搜索引擎.它可以对文字 ...

  2. Elasticsearch Dockerfile 例子

    文章转载自:https://elasticstack.blog.csdn.net/article/details/111692444 前提条件 在继续执行本教程中概述的步骤之前,你需要具备一个关键的先 ...

  3. Linux命令系列之ls——原来最简单的ls这么复杂

    Linux命令系列之ls--原来最简单的ls这么复杂 ls命令应该是我们最常用的命令之一了,但是我们可能容易忽略那些看起来最简单的东西. 简介 ls命令的使用格式如下 ls [选项] [具体的文件] ...

  4. 堆内存动态分配情况和jvm调优方向

    由上图可以看出: 堆中分为新生代(占堆1/3内存)和老年代(占堆2/3内存), 新生代又分为Eden区(占新生代内存的8/10)和survivor区(占新生代内存的2/10), survivor区又分 ...

  5. Docker | 自定义网络(网关、子网地址)

    了解 docker network 通过下面的命令来获取帮助 docker network --help Commands: connect Connect a container to a netw ...

  6. 4.RabbitMQ系列之发布/订阅模式

    我们把一个消息转发给多个消费者,这种模式称之为发布-订阅模式 1.交换器(Exchange) RabbitMq消息模式的核心思想是:一个生产者并不会直接往一个队列中发送消息,事实上,生产者根本不知道它 ...

  7. vue+spirngboot 分离技术实现图书信息的增删改查(改造这学期的课程设计【1】)

    1.前端项目的创建 vue init webpack bookshopvue 安装axios http://www.axios-js.com/ npm install --save axios vue ...

  8. Codeforces Round #829 (Div. 2)/CodeForces1754

    CodeForces1754 注:所有代码均为场上所书 Technical Support 解析: 题目大意 给定一个只包含大写字母 \(\texttt{Q}\) 和 \(\texttt{A}\) 的 ...

  9. SQL---ltrim()和rtrim()函数的使用

    背景 去除字符串首尾空格大家肯定第一个想到trim()函数,不过在sqlserver中是没有这个函数的,却而代之的是ltrim()和rtrim()两个函数. 看到名字所有人都 知道做什么用的了,ltr ...

  10. 你给文字描述,AI艺术作画,精美无比!附源码,快来试试!

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 TensorFlow 实战系列:https://www.showmeai ...