日期:2014-05-17  浏览次数:20994 次

请教一个多线程编程的问题
小弟作业,让写一个监控局域网电脑是否在线的程序。老湿让用循环的方法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"].T