winform应用中多线程界面的刷新问题(如何实现类似Splash屏)

liul17 2008-09-22 01:12:57
正在做一个WinForm应用,里面不少地方需要添加进度条显示,比如:界面分3个区域,当其中某个区域加载数据时,就在这个区域的中央位置显示一个进度条(或者是动态图片都成),然后后面的界面(比如是个ListView控件)一直要加载数据,加载完成后进度条消失,我在网上查了很长时间,找到的方法都不能很好的解决,目前的主要问题就是:
当ListView在加载数据时,依然有界面停顿的情况,下面是我的程序(窗体上画一个按钮button2,一个ListView,一个进度条progressBar2),请大家帮忙看下,谢谢先
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace Test1
{
public partial class frmPgb : Form
{
public frmPgb()
{
InitializeComponent();
}
private ProgressHandler myProgress;
private RefreshHandler myLoadData;
private delegate void RefreshHandler();
private delegate void StopHandle();
private delegate void ProgressHandler(bool val);

private void button2_Click(object sender, EventArgs e)
{
//显示进度条
Thread th = new Thread(new ThreadStart(ShowProgressBar));
th.Start();

//加载大量数据
Thread th1 = new Thread(new ThreadStart(LoadData));
th1.Start();

//结束
Console.WriteLine("End............");
}

private void frmPgb_Load(object sender, EventArgs e)
{
this.myLoadData += new RefreshHandler(LoadData);
this.myProgress += new ProgressHandler(MangerProgressBar);

this.progressBar2.Visible = false;
this.progressBar2.Style = ProgressBarStyle.Marquee;
}
//显示进度条
private void ShowProgressBar()
{
if (!this.progressBar2.InvokeRequired)
{
this.progressBar2.Visible = true;
}
else
{
this.BeginInvoke(this.myProgress, new object[] { true });
}
}

private void MangerProgressBar(bool val)
{
this.progressBar2.Visible = val;
}

//加载数据
private void LoadData()
{
if (!this.InvokeRequired)
{
for (long i = 0; i < 10000; i++)
{
listView1.Items.Add("item_" + i);
Console.WriteLine("i=" + i);
}
}
else
{
this.BeginInvoke(this.myLoadData);
}
}

}
}
...全文
674 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
johnfuwei 2011-10-25
  • 打赏
  • 举报
回复
關注ing...
wangyufa520 2010-08-18
  • 打赏
  • 举报
回复
我也实现不了。。关注
云想慕尘 2008-10-05
  • 打赏
  • 举报
回复
我也遇到了同样的问题,头痛中……
JackLucifer 2008-09-26
  • 打赏
  • 举报
回复
好问题,值得学习。
marvelstack 2008-09-25
  • 打赏
  • 举报
回复
问得很经典的一个问题,关于这种类似的问题,我写了一篇文章,提供源代码和分析示例,
http://blog.csdn.net/zhzuo/archive/2008/07/23/2699305.aspx

建议楼主参考,如果还有问题请给我短信。
yoyoalphax 2008-09-23
  • 打赏
  • 举报
回复
ListView加载数据要用委托
yoyoalphax 2008-09-23
  • 打赏
  • 举报
回复
进度条没必要新开一个线程貌似,控制进度条写在LoadData里面就可以了!

不操作主线程的话不需要委托的,我以前就这样做的,完全可以实现你的需求。
W422080367 2008-09-23
  • 打赏
  • 举报
回复
之前也遇到过这样的问题,虽然是多线程,但是只要和主线程的控件进行通信,就会阻塞主线程 也就是界面的阻塞。 搞了好久也没搞明白。
lidup 2008-09-23
  • 打赏
  • 举报
回复
你说是listview中没有加载数据? 看代码没看出问题来
ZengHD 2008-09-23
  • 打赏
  • 举报
回复
To: lidup

我2楼的代码是可以运行的,但ListView还是不能刷新,你帮我看看
lidup 2008-09-23
  • 打赏
  • 举报
回复
不能,但是数据取的过程是可以拿到ui线程之外的,当取完数据后再到ui的主线程。
public void init()
{
AsyncCallback asyn = new AsyncCallback(setLabelValue); //线程回调类
beginInvokeDelegate b1 = new beginInvokeDelegate(testBeginInvoke); //代理类定义为testBeginInvoke方法。
b1.BeginInvoke(asyn, b1); //异步调用
}


//该方法取数据,不是用的ui线程
private string testBeginInvoke()
{

}

//取完数据,this.Invoke()可以调用ui线程,将取到的数据给listview
private void setLabelValue(IAsyncResult ar)
{
if (ar.IsCompleted)
{
beginInvokeDelegate b1 = ar.AsyncState as beginInvokeDelegate;
string s = b1.EndInvoke(ar);
this.Invoke(new EventHandler(setWindowsLabelValue));
}
}


ZengHD 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 jingliuting 的回复:]
ListView控件刷新的问题,只能换控件譬如用DataGridView。
你能把ListView拿到UI线程外么?
[/Quote]

已经重新开一个线程了

じоνё靁〃 2008-09-23
  • 打赏
  • 举报
回复
ListView控件刷新的问题,只能换控件譬如用DataGridView。
你能把ListView拿到UI线程外么?
abcyzq 2008-09-23
  • 打赏
  • 举报
回复
学习。
ZengHD 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 lidup 的回复:]
还有不明白的吗?等着接分哈
[/Quote]
我不明白

大侠继续讲课啊

lidup 2008-09-23
  • 打赏
  • 举报
回复
还有不明白的吗?等着接分哈
lidup 2008-09-23
  • 打赏
  • 举报
回复
ThreadRecallBack在这个函数里面你可以不看。重点是begininvokeDelegate,recallBackDelegate,他是一个代理类public delegate string beginInvokeDelegate(); public delegate void recallBackDelegate(string id, string name); begininvokeDelegate负责启动异步线程,recallBackDelegate用来当异步线程执行完后应该操作的东西就放里面。这两个都是委托
yagebu1983 2008-09-22
  • 打赏
  • 举报
回复
没弄过!!
关注!!
konglingkang 2008-09-22
  • 打赏
  • 举报
回复
看不懂!!!!!解释解释!!
ximi82878 2008-09-22
  • 打赏
  • 举报
回复
没用过。。。。。。学习 帮顶~~~~~~~
加载更多回复(20)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧