http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 14000|回复: 10

[其他] 关于多线程更新listview的问题

[复制链接]
发表于 2014-3-24 18:59:15 | 显示全部楼层 |阅读模式
本帖最后由 Monn 于 2014-3-25 14:31 编辑

问题已解决,多谢@superai 和 @yyhapy   的帮助,下面贴上解决后的代码,给遇到此问题的兄弟一提示。


[C#] 纯文本查看 复制代码
System.Threading.Thread t;//定义线程
        private delegate void VoidDelegate();//定义委托
        private void Form1_Load(object sender, EventArgs e)
        {
            t = new System.Threading.Thread(new System.Threading.ThreadStart(this.DoCheckIp));
        }        
        private void button1_Click(object sender, EventArgs e)
        {
            t.Start();//线程开始
        }
        ProxyHelper py = new ProxyHelper();//初始化ProxyHelper类
        private void DoCheckIp()
        {
            for (int i = 0; i < listIps.Items.Count; i++)
            {
                //listIps.Items[i].SubItems[2].Text = "测试中...";
                //listIps.Items[i].SubItems[2].Text = py.CheckProxy(listIps.Items[i].SubItems[1].Text).ToString();
                //listIps.Items[i].SubItems[3].Text = py.GetPingTime(listIps.Items[i].SubItems[1].Text);
                //listIps.Items[i].SubItems[4].Text = py.GetIPAddress(listIps.Items[i].SubItems[1].Text);

                string ip = "";
                string jg = "检测中...";
                string pingtime = "";
                string ipaddress = "";
                this.Invoke(new VoidDelegate(delegate()
                {
                    ip = listIps.Items[i].SubItems[1].Text;
                }));

                //显示检测中
                this.Invoke(new VoidDelegate(delegate()
                {
                    listIps.Items[i].SubItems[2].Text = jg;
                }));
                //判断代理是否可用,不可用就直接显示失败,不在检测ping值和归属地
                if (py.CheckProxy(ip))
                {
                    jg = "成功";
                    pingtime = py.GetPingTime(ip).ToString();
                    ipaddress = py.GetIPAddress(ip).ToString();                    
                }
                else
                {
                    jg = "失败";
                    pingtime = "";
                    ipaddress = "";
                }

                this.Invoke(new VoidDelegate(delegate()
                {
                    listIps.Items[i].SubItems[2].Text = jg;
                    listIps.Items[i].SubItems[3].Text = pingtime;
                    listIps.Items[i].SubItems[4].Text = ipaddress;
                }));
            }

                                      
        }





我需要读取listview第二列的值,然后根据第二列的值分析后,写入第三列,更新的时候加入了多线程,也使用了委托,但是还是会整个循环处理完才会更新listview界面。。界面还非常卡,不知道俺的代码哪里出问题了,请大侠们帮助。。代码如下。。


[C#] 纯文本查看 复制代码
System.Threading.Thread t;//定义线程
        private delegate void VoidDelegate();//定义委托
        private void Form1_Load(object sender, EventArgs e)
        {
            t = new System.Threading.Thread(new System.Threading.ThreadStart(this.DoCheckIp));
        }        
        private void button1_Click(object sender, EventArgs e)
        {
            t.Start();//线程开始
        }
        ProxyHelper py = new ProxyHelper();//初始化ProxyHelper类
        private void DoCheckIp()
        {
            this.Invoke(new VoidDelegate(delegate()
            {
                for (int i = 0; i < listIps.Items.Count; i++)
                {
                    listIps.Items[i].SubItems[2].Text = "测试中...";
                    listIps.Items[i].SubItems[2].Text = py.CheckProxy(listIps.Items[i].SubItems[1].Text).ToString();
                    listIps.Items[i].SubItems[3].Text = py.GetPingTime(listIps.Items[i].SubItems[1].Text);
                    listIps.Items[i].SubItems[4].Text = py.GetIPAddress(listIps.Items[i].SubItems[1].Text);
                    System.Threading.Thread.Sleep(1000);
                }
            }));                           
        }


直接把我的工程发上来。。其实就是个代理测试小程序。。请有空的大神帮忙看看咋处理。。 代理测试.zip (91.87 KB, 下载次数: 88)


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-3-25 10:47:45 | 显示全部楼层
刚刚试了下,正如4楼所说的,验证代理是否能用不应该放在委托里,应该循环里,先验证,然后才将结果传给委托,这样才能完全解决卡顿的问题
发表于 2014-3-24 21:24:14 | 显示全部楼层
[C#] 纯文本查看 复制代码
      private delegate void VoidDelegate(int i);//定义委托
      public void getpy(int i)
        {
            listIps.Items[i].SubItems[2].Text = "测试中...";
            listIps.Items[i].SubItems[2].Text = py.CheckProxy(listIps.Items[i].SubItems[1].Text).ToString();
            listIps.Items[i].SubItems[3].Text = py.GetPingTime(listIps.Items[i].SubItems[1].Text);
            listIps.Items[i].SubItems[4].Text = py.GetIPAddress(listIps.Items[i].SubItems[1].Text);
        }

        private void DoCheckIp()
        {
            VoidDelegate dl = new VoidDelegate(getpy);

            for (int i = 0; i < listIps.Items.Count; i++)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(dl,i);
                }
                Thread.Sleep(1000);
            }
                       
        }




我试了一下  可以在查询完IP以后更新,一行一行的更新,但是还是会有卡窗口的情况。。不知道怎么弄了。。

 楼主| 发表于 2014-3-24 21:32:04 | 显示全部楼层
yyhapy 发表于 2014-3-24 21:24
[mw_shl_code=csharp,true]      private delegate void VoidDelegate(int i);//定义委托
      public vo ...

非常感谢,这已经比我原来的强了。虽然没有完全解决,还是要谢谢你的帮忙。
发表于 2014-3-24 22:33:48 | 显示全部楼层
Monn 发表于 2014-3-24 21:32
非常感谢,这已经比我原来的强了。虽然没有完全解决,还是要谢谢你的帮忙。

理论上这样更新窗体不会卡了。。。不知道咋回事,我觉得有可能问题在查询的那个步骤
发表于 2014-3-25 09:37:02 | 显示全部楼层
代码我还没上机测试,但是感觉不应该在委托里加System.Threading.Thread.Sleep(1000)。
你可以想下,进委托里开始循环,但是更新一个又要sleep一秒,结果还是要等整个委托完成你才能流畅操作。
试下把委托放在循环里吧。纯属建议,可以试试
发表于 2014-3-25 10:10:51 | 显示全部楼层
System.Threading.Thread.Sleep(1000);这个静态方法暂停的是主线程。所以每次更新的时候会卡一下窗口。
 楼主| 发表于 2014-3-25 14:01:03 | 显示全部楼层
superai 发表于 2014-3-25 10:47
刚刚试了下,正如4楼所说的,验证代理是否能用不应该放在委托里,应该循环里,先验证,然后才将结果传给委 ...

可否把你测试的代码贴上来?俺是菜鸟一个。。对多线程和委托是一知半解的。。
 楼主| 发表于 2014-3-25 14:26:30 | 显示全部楼层
superai 发表于 2014-3-25 10:47
刚刚试了下,正如4楼所说的,验证代理是否能用不应该放在委托里,应该循环里,先验证,然后才将结果传给委 ...

已经解决了,不用放代码了,多谢你的提醒。 真的太感谢了。
发表于 2014-3-25 15:05:49 | 显示全部楼层
Monn 发表于 2014-3-25 14:26
已经解决了,不用放代码了,多谢你的提醒。 真的太感谢了。

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-24 04:58

© 2014-2021

快速回复 返回顶部 返回列表