C#winform做了个form,进度条progressbar风格是marquee,可随时更新此form上Label控件显示的信息
这个form需要定义一个属性,要求实例化这个form后,给此属性赋一个字符串,form上的label显示的信息就立即更新(显示赋予的这个字符串),而且进度条要是多线程的(...
这个form需要定义一个属性,要求实例化这个form后,给此属性赋一个字符串,form上的label显示的信息就立即更新(显示赋予的这个字符串),而且进度条要是多线程的(单线程的执行海量任务时进度条会卡住不动),progressbar一直是来回闪动就好,不做其他处理,望大神解决!
展开
2个回答
展开全部
private void button3_Click(object sender, EventArgs e)
{
Thread t = new Thread(() =>
{
//调用控件的invoke函数,表示里面代码将会异步到拥有该控件的线程里执行。
this.progressBar1.Invoke(new Action<int>(a=>
{
this.progressBar1.Value=a;
}
),80);//80是传递给Invoke()的参数,在这里表示进度条达到的长度
}
);
t.Start();
}
追问
progressBar不需要做任何处理啊,最关键的是我想随时更新label显示的信息,这个form需要定义一个属性,要求实例化这个form后,给此属性赋一个字符串,form上的label显示的信息就立即更新(显示赋予的这个字符串)!!主要是为了实现这个
追答
道理是一样的。创建新线程,调用控件的Invoke函数。
我把函数拆开来写。清晰一点。
你自己改一下button click函数里面的for循环那部分,改成你自己想要的赋值方式。
private void button4_Click(object sender, EventArgs e)
{
Thread t = new Thread(() =>
{
for (int i = 0; i < 11190; i++)
{
Change(i.ToString());
}
}
);
t.Start();
}
public void UpdateLabel(string msg)
{
this.label1.Text = msg;
}
public void Change(string str)
{
Thread t = new Thread(() =>
{
this.label1.Invoke(new Action<string>(UpdateLabel),str);
}
);
t.Start();
}
2015-10-14
展开全部
你可以单独开个线程给进度条!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询