小弟作业,让写一个监控局域网电脑是否在线的程序。老湿让用循环的方法ping在同一个网段的电脑,如果连续3次不能Ping通则认为该电脑不在线。我用Listview控件表示电脑,listview.item.text表示电脑名称,listview.item.tooltip表示电脑的ip,然后还要将ping的情况实时在listview控件上显示出来,并给网管发送短信提示。一开始我直接在form_load中执行死循环的ping,会造成界面卡死;如果新开线程执行这个耗时操作,但是我不知道如何在这个线程中如何实时的获取或设置主线程建立的控件的属性,直接运行程序会提示“线程间操作无效: 从不是创建控件ListView1的控件访问它”。轻各位大侠指教
附部分代码:
namespace 脱机监控
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
IDataReader dr;
Thread t;
private void Form1_Load(object sender, EventArgs e)
{
genlist();
Thread t = new Thread(checknetwork);
t.IsBackground = true;
t.Start();
} public void genlist()
{
//清空lsv,防止重复生成列表
listView1.Clear();
dr = null;
//加载数据库中的监控点到ListView
using (MySqlConnection conn = new MySqlConnection(sqlconnstr))
{
conn.Open();
using (MySqlCommand cmd = new MySqlCommand("select * from checkpoint", conn))
{
dr = cmd.ExecuteReader();
//遍历记录集,将监控点信息添加到ListView中,checkpointname标记监控点,checkpointip为IP地址
while (dr.Read())
{
ListViewItem Item = new ListViewItem(dr["checkpointname"].ToString(), 0);
Item.ToolTipText = dr["checkpointip"].ToString();
listView1.Items.AddRange(new ListViewItem[] { Item }); }
dr.Close();
}
}
} private void checknetwork()
{ while (true)
{
//autoEvent.WaitOne(); //阻塞当前线程,等待通知以继续执行
for (int i = 0; i < listView1.Items.Count; i++)
{
//开始遍历listview控件,ping遍历到的item,看看能否Ping通
Ping p1 = new Ping();
PingOptions options = new PingOptions(64, true);
disconn = 0;
for (int j = 0; j < 5; j++)
{
try
{
PingReply reply = p1.Send(listView1.Items[i].ToolTipText);//阻塞方式 //显示Ping是否成功
if (reply.Status != IPStatus.Success)
{
disconn += 1;
}
}
catch
{
disconn += 1;
}
} if (disconn > 2)
{
//如果连续3此无法联系到监控点,认为该点脱离监控。
//将监控点图标状态改为imagelist索引1,
try
{
listView1.Items[i].ImageIndex = 1;
//已经发送了几次短信
//如果还没有发送过短信,那么向告警表写入告警日志
if (data.returnstr("select sendsmsnum from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'") == "0")
{
data.returnint("insert into alarm(checkpointip,alarm,alarmtime) values('" + listView1.Items[i].ToolTipText + "','通信中断告警!无法连接到监控点:“" + listView1.Items[i].Text + "”','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')");
showalarm();
//向网管发送短信
sm("通信中断告警!无法连接到监控点:“" + listView1.Items[i].Text + "”,发生时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), data.returnstr("select mobile from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'"));
data.returnint("update checkpoint set sendsmsnum=1 where checkpointip='" + listView1.Items[i].ToolTipText + "'");
}
}
catch (Exception e) { MessageBox.Show("发生错误::" + e.ToString()); }
}
else
{
//如果该点上次的状态是中断的,发送通信恢复提示。判断依据:olt表的sendsmsnum==1
if (data.returnstr("select sendsmsnum from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'") == "1")
{
sm("通信恢复通知。连接到监控点“" + listView1.Items[i].Text + "”,恢复时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), data.returnstr("select mobile from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'"));
//向告警表写入告警恢复日志
data.returnint("insert into alarm(checkpointip,alarm,alarmtime) values('" + listView1.Items[i].ToolTipText + "','通信恢复通知!连接到监控点:“" + listView1.Items[i].Text + "”','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')");
showalarm(); }
//只要能连接上设备,每次循环都要将发送短信次数设置为0
data.returnint("update checkpoint set sendsmsnum=0 where checkpointip='" + listView1.Items[i].ToolTipText + "'");
try
{
listView1.Items[i].ImageIndex = 0;
}
catch { }
}
}
}
} }
}
附部分代码:
namespace 脱机监控
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
IDataReader dr;
Thread t;
private void Form1_Load(object sender, EventArgs e)
{
genlist();
Thread t = new Thread(checknetwork);
t.IsBackground = true;
t.Start();
} public void genlist()
{
//清空lsv,防止重复生成列表
listView1.Clear();
dr = null;
//加载数据库中的监控点到ListView
using (MySqlConnection conn = new MySqlConnection(sqlconnstr))
{
conn.Open();
using (MySqlCommand cmd = new MySqlCommand("select * from checkpoint", conn))
{
dr = cmd.ExecuteReader();
//遍历记录集,将监控点信息添加到ListView中,checkpointname标记监控点,checkpointip为IP地址
while (dr.Read())
{
ListViewItem Item = new ListViewItem(dr["checkpointname"].ToString(), 0);
Item.ToolTipText = dr["checkpointip"].ToString();
listView1.Items.AddRange(new ListViewItem[] { Item }); }
dr.Close();
}
}
} private void checknetwork()
{ while (true)
{
//autoEvent.WaitOne(); //阻塞当前线程,等待通知以继续执行
for (int i = 0; i < listView1.Items.Count; i++)
{
//开始遍历listview控件,ping遍历到的item,看看能否Ping通
Ping p1 = new Ping();
PingOptions options = new PingOptions(64, true);
disconn = 0;
for (int j = 0; j < 5; j++)
{
try
{
PingReply reply = p1.Send(listView1.Items[i].ToolTipText);//阻塞方式 //显示Ping是否成功
if (reply.Status != IPStatus.Success)
{
disconn += 1;
}
}
catch
{
disconn += 1;
}
} if (disconn > 2)
{
//如果连续3此无法联系到监控点,认为该点脱离监控。
//将监控点图标状态改为imagelist索引1,
try
{
listView1.Items[i].ImageIndex = 1;
//已经发送了几次短信
//如果还没有发送过短信,那么向告警表写入告警日志
if (data.returnstr("select sendsmsnum from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'") == "0")
{
data.returnint("insert into alarm(checkpointip,alarm,alarmtime) values('" + listView1.Items[i].ToolTipText + "','通信中断告警!无法连接到监控点:“" + listView1.Items[i].Text + "”','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')");
showalarm();
//向网管发送短信
sm("通信中断告警!无法连接到监控点:“" + listView1.Items[i].Text + "”,发生时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), data.returnstr("select mobile from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'"));
data.returnint("update checkpoint set sendsmsnum=1 where checkpointip='" + listView1.Items[i].ToolTipText + "'");
}
}
catch (Exception e) { MessageBox.Show("发生错误::" + e.ToString()); }
}
else
{
//如果该点上次的状态是中断的,发送通信恢复提示。判断依据:olt表的sendsmsnum==1
if (data.returnstr("select sendsmsnum from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'") == "1")
{
sm("通信恢复通知。连接到监控点“" + listView1.Items[i].Text + "”,恢复时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), data.returnstr("select mobile from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'"));
//向告警表写入告警恢复日志
data.returnint("insert into alarm(checkpointip,alarm,alarmtime) values('" + listView1.Items[i].ToolTipText + "','通信恢复通知!连接到监控点:“" + listView1.Items[i].Text + "”','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')");
showalarm(); }
//只要能连接上设备,每次循环都要将发送短信次数设置为0
data.returnint("update checkpoint set sendsmsnum=0 where checkpointip='" + listView1.Items[i].ToolTipText + "'");
try
{
listView1.Items[i].ImageIndex = 0;
}
catch { }
}
}
}
} }
}
解决方案 »
- 获取浏览器html元素坐标
- 有人用u盘做过这样的功能吗?只有用程序可控制
- winform 的 flowLayoutPanel控件 如何让滚动条在最后边
- c#中如何模拟浏览器访问网页
- 求推荐一个服务器
- 压缩解压缩的代码,哪里出问题了??
- 请问如何遍历一个实例的所有属性,得到属性的名称和值,是实例不是类型哦
- 水晶报表问题,高分相赠!
- 谈谈目前最受关注、最牛、有了这些技术可以拿高薪的那些技术!
- 在线送分 两个问题asp.net 1.asp:dropdownlist.....OnSelectedIndexChanged="updateCopyCompany">不起作用;2.用判断页面有效性
- c# winform 里插进web浏览器功能,web页和form窗体之前怎么传输数据
- button如何取的treeview的节点
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
IDataReader dr;
Thread t;
delegate void workHanddler();
private void Form1_Load(object sender, EventArgs e)
{
genlist();
Thread t = new Thread(work);
t.IsBackground = true;
t.Start();
} public void genlist()
{
//清空lsv,防止重复生成列表
listView1.Clear();
dr = null;
//加载数据库中的监控点到ListView
using (MySqlConnection conn = new MySqlConnection(sqlconnstr))
{
conn.Open();
using (MySqlCommand cmd = new MySqlCommand("select * from checkpoint", conn))
{
dr = cmd.ExecuteReader();
//遍历记录集,将监控点信息添加到ListView中,checkpointname标记监控点,checkpointip为IP地址
while (dr.Read())
{
ListViewItem Item = new ListViewItem(dr["checkpointname"].ToString(), 0);
Item.ToolTipText = dr["checkpointip"].ToString();
listView1.Items.AddRange(new ListViewItem[] { Item }); }
dr.Close();
}
}
} private void work()
{
workHanddler wh=new workHanddler(checknetwork);
this.Invoke(wh);
}
private void checknetwork()
{ while (true)
{
//autoEvent.WaitOne(); //阻塞当前线程,等待通知以继续执行
for (int i = 0; i < listView1.Items.Count; i++)
{
//开始遍历listview控件,ping遍历到的item,看看能否Ping通
Ping p1 = new Ping();
PingOptions options = new PingOptions(64, true);
disconn = 0;
for (int j = 0; j < 5; j++)
{
try
{
PingReply reply = p1.Send(listView1.Items[i].ToolTipText);//阻塞方式 //显示Ping是否成功
if (reply.Status != IPStatus.Success)
{
disconn += 1;
}
}
catch
{
disconn += 1;
}
} if (disconn > 2)
{
//如果连续3此无法联系到监控点,认为该点脱离监控。
//将监控点图标状态改为imagelist索引1,
try
{
listView1.Items[i].ImageIndex = 1;
//已经发送了几次短信
//如果还没有发送过短信,那么向告警表写入告警日志
if (data.returnstr("select sendsmsnum from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'") == "0")
{
data.returnint("insert into alarm(checkpointip,alarm,alarmtime) values('" + listView1.Items[i].ToolTipText + "','通信中断告警!无法连接到监控点:“" + listView1.Items[i].Text + "”','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')");
showalarm();
//向网管发送短信
sm("通信中断告警!无法连接到监控点:“" + listView1.Items[i].Text + "”,发生时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), data.returnstr("select mobile from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'"));
data.returnint("update checkpoint set sendsmsnum=1 where checkpointip='" + listView1.Items[i].ToolTipText + "'");
}
}
catch (Exception e) { MessageBox.Show("发生错误::" + e.ToString()); }
}
else
{
//如果该点上次的状态是中断的,发送通信恢复提示。判断依据:olt表的sendsmsnum==1
if (data.returnstr("select sendsmsnum from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'") == "1")
{
sm("通信恢复通知。连接到监控点“" + listView1.Items[i].Text + "”,恢复时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), data.returnstr("select mobile from checkpoint where checkpointip='" + listView1.Items[i].ToolTipText + "'"));
//向告警表写入告警恢复日志
data.returnint("insert into alarm(checkpointip,alarm,alarmtime) values('" + listView1.Items[i].ToolTipText + "','通信恢复通知!连接到监控点:“" + listView1.Items[i].Text + "”','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')");
showalarm(); }
//只要能连接上设备,每次循环都要将发送短信次数设置为0
data.returnint("update checkpoint set sendsmsnum=0 where checkpointip='" + listView1.Items[i].ToolTipText + "'");
try
{
listView1.Items[i].ImageIndex = 0;
}
catch { }
}
}
}
} }
}
如:listView1.BeginInvoke((Action)(()=>{
listView1.Items[i].ImageIndex = 0;
}));
教材上写的BeginInvoke是异步的,Invoke是同步的,我不太理解。是不是BeginInvoke就是另外开了一个线程?还是BeginInvoke和Ajax的异步概念差不多呢?就是程序不等待执行结果?而用Invoke的时候,虽然是在子线程执行的代码,但是子线程也要等待执行的结果,获取到结果后才继续执行程序呢?
CheckForIllegalCrossThreadCalls = false;确实是错误的,虽然能正常运行程序,但是不可预料的问题太多,还是老老实实按照微软的要求学委托和线程吧,唉~~~~学的我头大