由于兴趣爱好,自学c#不到两个月时间,正好赶上公司项目需要,寻找各种技术文章实现了一个简单的进程监视小程序。为自己以后学习回顾作参考了。
需求:定时对某一进程进行监视,如发现程序关掉后,自动开启该程序,保证业务的正常运行。
功能划分:1、知道用户选择的什么程序(如果单纯为公司产品服务,可直接指定文件名,方便多了)
2、获取用户选择的监视间隔时间
3、遍历当前进程,查看软件运行状态。
具体实现如下:
第一步:设计程序窗体:
功能细解:
北京时间:直接调用本地时间。需要用多线程进行处理。
程序名称:用户点击浏览弹出对话框,提供更加方便的监视程序的选择。
加入任务栏:这个板块实际上是为了体验效果,对程序实现并起不了多大作用。后边两个小按钮完全是为了练习checkbox控件而添加的,可以通过button直接实现。
间隔时间:这个是程序的监视需要间隔的时间段
开始监视||暂停监视:不解释。
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data; using System.Drawing;
using System.Linq; using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
namespace 进程监视如软件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//设置多线程调用异常问题
CheckForIllegalCrossThreadCalls = false;
}
/// <summary>
/// 打开一个文件浏览对话框,同时将选中的程序路径存入tb_input容器内
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openfd = new OpenFileDialog();
if (openfd.ShowDialog() == DialogResult.OK)
{
tb_input.Text = openfd.FileName;
}
}
private void Form1_Load(object sender, EventArgs e)
{
Thread td = new Thread(new ThreadStart(ShowTime));
td.Start();
}
/// <summary>
/// 显示当前时间,使用多线程来操作
/// </summary>
private void ShowTime()
{
while (true)
{
GC.Collect(); //多余的垃圾回收,一般不作处理,.NET自动帮我们处理好了
btn_showtime.Text = DateTime.Now.ToString();
Thread.Sleep(1000);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//在多线程中结束一切窗体
System.Environment.Exit(System.Environment.ExitCode);
this.Dispose();
this.Close();
}
private void chb_input_CheckedChanged(object sender, EventArgs e)
{
if (tb_input.Text == "")
{
MessageBox.Show("请选择要监视的程序");
}
else if (chb_input.Checked)
{
chb_out.CheckState = CheckState.Unchecked;
rt_box.Text = "1、" + tb_input.Text;
}
}
private void chb_out_CheckedChanged(object sender, EventArgs e)
{
if (chb_out.CheckState == CheckState.Checked)
{
if (tb_input.Text == "")
{
MessageBox.Show("没有可要删除的进程");
chb_out.CheckState = CheckState.Unchecked;
}
else
{
chb_input.CheckState = CheckState.Unchecked;
rt_box.Clear();
}
}
//if (tb_input.Text == "") //{ // MessageBox.Show("没有可要删除的进程"); // chb_out.CheckState = CheckState.Checked; //} //else if (chb_out.Checked) //{ // chb_input.CheckState = CheckState.Unchecked; // rt_box.Clear(); //} }
private void button2_Click(object sender, EventArgs e)
{
if (rt_box.Text == "")
{
MessageBox.Show("请将需要监视的程序加入到任务列表");
}
else
{
Thread td = new Thread(new ThreadStart(IsJinChen));
td.Start();
}
}
private void IsJinChen()
{
while (true)
{
GC.Collect();
bool mark = false;
foreach (Process process in System.Diagnostics.Process.GetProcesses())
{
if (process.ProcessName == System.IO.Path.GetFileNameWithoutExtension(tb_input.Text))
{
//说明当前系统已存在用户选择的进程,不做任何操作
mark = true;
//break;
}
}
if (mark == false)
{
JCstart();
}
else
{
Thread.Sleep(Convert.ToInt32( numUPdowm.Value)*60000);
continue;
} }
}
private void JCstart()
{
Process.Start(tb_input.Text);
}
private void button3_Click(object sender, EventArgs e)
{
//Thread td = Thread.CurrentThread;
//Thread.Sleep(10000);
}
}
}