关于C#用线程实现进度条的功能实现?在线等待。。!!!!!! 我现在界面上有两个listview。在第一个listview1上我点击某一项,listview2将先清空所有项,再加载对应的项。项也比较多。这样的话,刷新的肯定很难看。所以我想弹出个框,显示进度,加载完成后,再关闭进度框到主界面。一直都没有做过这个东西,求高手指点啊。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 添加progressBar控件其maximun为你增加项的数目,每增加一个项其value加1.注意刷新 晕哦,为什么我的那个进度条的小FORM 都不出来哦。我show()了之后都不出来,太假了吧、 不是应该backgroudworker来进度条吗? 去年还是前年做的了.现成的.让用户爱上你的程序忙碌假死参数说明:ShowMask(指定要遮罩的控件,旋转标记的规格模式:16*16,24*24,32*32,64*64)[下载:WorkingMsk] WorkingMSK1.A_KEY = "D";WorkingMSK1.SHOWMSK(ListBox1, 2); //将某个控件遮罩起来并显示旋转的忙碌标记WorkingMSK1.DELEMSK(ListBox1); //将已经遮罩的控件取消遮罩 说实话我们项目中也是用backgroundworker来做进度条,但是,MSDN上明确写着,不要再DoWork方法中控制UI。。 在赋值时progressBar.Value=i后,执行System.Windows.Forms.Application.DoEvent(); 我也正困扰这个问题,你的方法解决不了他的疑惑。他加载项很多,而且可能有阻塞线程,这个时候会让Timer_Ticker事件无法启动,因此也看不到进度条的变化。 我现在转换了一个思路了,不让进度条循环滚动,就按进度前进,然后在每一个加载项加载成功的时候,就强行给ProgressBar.Value赋值,具体每次增加多少,根据每个加载项的大致加载时间的占比来填写。这样做确实还不能完全让我满意,但是这也是现在能想到的最好的一个效果了。 给你发个简单点的用异步委托: //异步delegate private delegate int TestDelegate(int i); private void button1_Click(object sender, EventArgs e) { TestDelegate t = Test; IAsyncResult i = t.BeginInvoke(5000, null, null); ProgressForm f = null; if (!i.IsCompleted) { //这个窗体上放了progressBar控件,Style属性设置为Marquee---实现来回滚动 //这个并没有实现准确返回实际进度,只是告诉用户程序没有死掉 //要实现准确返回实际进度也不难,只需要看一下线程,委托,跨线程调用控件的知识就可以啦 f = new ProgressForm(); f.ShowDialog(); } int j = t.EndInvoke(i); if (j > 5000) { if (f != null) { f.Close(); f = null; } } } private int Test(int i) { //模拟耗时操作 Thread.Sleep(i); return ++i; } 在发一个吧 private delegate void TestDelegate(); Form2 f2 = null; private void button1_Click(object sender, EventArgs e) { f2 = new Form2(); Thread thread = new Thread(new ThreadStart(Test)); thread.Start(); // f2.ShowDialog(); } private void Test() { //模拟耗时操作 Thread.Sleep(5000); if (f2 != null) { CloseForm(); } } private void CloseForm() { if (this.InvokeRequired) { TestDelegate t = new TestDelegate(CloseForm); this.Invoke(t); } else { f2.Close(); } } 程序运行但是界面卡死加线程了难道是我加的线程不对? 问一个小问题 如何实现类似xp资源管理器的下拉框 -----------------C#问题非高手务进------------------- 高手帮助!!谢谢! 一个正则的问题 c#中指针的赋值问题 发一个生成水印的方法,请各位指点一下。。 winform 隐藏Panel 显示多个button 当其中button离开时 panel显示 C#如何隐藏从基类中继承来的公开成员? KeyPress事件获取不了alt组合键,有办法解决吗? 怎么获得硬盘物理序列号?这段代码得到的是什么?
参数说明:ShowMask(指定要遮罩的控件,旋转标记的规格模式:16*16,24*24,32*32,64*64)[下载:WorkingMsk]
WorkingMSK1.SHOWMSK(ListBox1, 2); //将某个控件遮罩起来并显示旋转的忙碌标记
WorkingMSK1.DELEMSK(ListBox1); //将已经遮罩的控件取消遮罩
说实话我们项目中也是用backgroundworker来做进度条,但是,MSDN上明确写着,不要再DoWork方法中控制UI。。
他加载项很多,而且可能有阻塞线程,这个时候会让Timer_Ticker事件无法启动,因此也看不到进度条的变化。
private delegate int TestDelegate(int i); private void button1_Click(object sender, EventArgs e)
{
TestDelegate t = Test;
IAsyncResult i = t.BeginInvoke(5000, null, null);
ProgressForm f = null;
if (!i.IsCompleted)
{
//这个窗体上放了progressBar控件,Style属性设置为Marquee---实现来回滚动
//这个并没有实现准确返回实际进度,只是告诉用户程序没有死掉
//要实现准确返回实际进度也不难,只需要看一下线程,委托,跨线程调用控件的知识就可以啦
f = new ProgressForm();
f.ShowDialog();
} int j = t.EndInvoke(i);
if (j > 5000)
{
if (f != null)
{
f.Close();
f = null;
}
}
} private int Test(int i)
{
//模拟耗时操作
Thread.Sleep(i);
return ++i;
}
private delegate void TestDelegate(); Form2 f2 = null;
private void button1_Click(object sender, EventArgs e)
{
f2 = new Form2();
Thread thread = new Thread(new ThreadStart(Test));
thread.Start();
//
f2.ShowDialog();
} private void Test()
{
//模拟耗时操作
Thread.Sleep(5000);
if (f2 != null)
{
CloseForm();
}
} private void CloseForm()
{
if (this.InvokeRequired)
{
TestDelegate t = new TestDelegate(CloseForm);
this.Invoke(t);
}
else
{
f2.Close();
}
}