用线程中使用进度条(急!在线等)

EverLast2 2010-08-18 03:14:29
以前没用过线程,现在遇到一个问题要用线程解决的,网上的资料很乱,希望在这里可以听到更符合我的情况的解答。
我的项目里有个地方需要做复杂的运算,比较耗时间,所以采用了线程,顺便想用进度条显示进度。简单做了个模型,也遇到不少问题,例如要给线程的方法传参数,网上看到用类封装,挺好的,可是好像又听说不可以简单的在辅助线程里访问主线程的控件,于是试了一下,貌似可以啊:
    
//负责线程控制的类
class Manager
{
ProgressBar CalBar;
int CalLength;
public Manager(int CLenth, ProgressBar CBar) { CalBar = CBar; CalLength = CLenth; }
public void Cal()
{
CalBar.Minimum = 0;
CalBar.Maximum = CalLength;
CalBar.Value = 0;
for (int i = 0; i < CalLength; i++)
CalBar.Value++;
}
}
//由按钮触发的事件的捕捉
private void btnCal_Click(object sender, EventArgs e)
{
int CalLength = 100000;
Manager m = new Manager(CalLength, CalBar);// CalBar是进度条对象
Thread t = new Thread(m.Cal);
t.Start();
}

初看运行起来没有问题,进度条可以跑,窗口还可以运作。可后来思考后觉得有些问题:
1.可是不是说不能在辅助线程里使用控件资源么??我哪里理解错了呢??
2.假如我不断地点按钮触发这个事件,窗口会忽然关闭。为什么呢?是资源使用不当吗?因为假如不涉及进度条,我写了另外一个example,点的再多,也不会自动关闭窗口的。
...全文
256 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wind_199 2010-08-19
  • 打赏
  • 举报
回复
snowmoonking 2010-08-18
  • 打赏
  • 举报
回复
http://www.cnblogs.com/snowmoonking/articles/1794451.html
denbes 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 everlast2 的回复:]
以前没用过线程,现在遇到一个问题要用线程解决的,网上的资料很乱,希望在这里可以听到更符合我的情况的解答。
我的项目里有个地方需要做复杂的运算,比较耗时间,所以采用了线程,顺便想用进度条显示进度。简单做了个模型,也遇到不少问题,例如要给线程的方法传参数,网上看到用类封装,挺好的,可是好像又听说不可以简单的在辅助线程里访问主线程的控件,于是试了一下,貌似可以啊:

C# code

……
[/Quote]
我也很想知道什么原因?帮顶
在辅助线程中我试过一下调用主线程的窗体要用invoke
可是有些不用.
allen3010 2010-08-18
  • 打赏
  • 举报
回复
来看看
XPR 2010-08-18
  • 打赏
  • 举报
回复
线程访问控件好像是要通委托的invoke方法来传参
wxm3630478 2010-08-18
  • 打赏
  • 举报
回复
看一下 线程 和 跨线程访问控件 的一些资料
EverLast2 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 johndii 的回复:]
1、哪个IDE,竟然没报警。

[/Quote]
VS2008
EverLast2 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxm3630478 的回复:]

C# code

private delegate void delTest(int i);
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(Test));
thread.IsBackground……
[/Quote]
4楼,可以给个注释什么的,解释一下么?实在是初学,很多原理不懂。
johndii 2010-08-18
  • 打赏
  • 举报
回复
"
1.可是不是说不能在辅助线程里使用控件资源么??我哪里理解错了呢??
2.假如我不断地点按钮触发这个事件,窗口会忽然关闭。为什么呢?
"


1、哪个IDE,竟然没报警。
2、要用托管,不然不安全,你也体验了。用MethodInvoker吧
wxm3630478 2010-08-18
  • 打赏
  • 举报
回复

private delegate void delTest(int i);
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(Test));
thread.IsBackground = true;
thread.Start();
}

private void Test()
{
for(int i=0;i < 100;i++)
{
Thread.Sleep(100);
ShowProg(i);
}
}

private void ShowProg(int i)
{
if (this.InvokeRequired)
{
delTest t = delegate(int a)
{
this.progressBar1.Value = a;
};
this.Invoke(t,i);
}
}
EverLast2 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 rcy5211314 的回复:]

public Form1()
{
InitializeComponent();
//要加上这个
Form1.CheckForIllegalCrossThreadCalls = false;
}
[/Quote]
这个加上了好像没什么区别,还有本来都问题。
EverLast2 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 rcy5211314 的回复:]

//线程好像是这样使?!
Thread thread=new Thread(new ThreadStart(f));
thread.Start();
[/Quote]
好像看到msdn有new ThreadStart,我写的时候忘了,可是也跑得动,有人可以顺便解释一下么?
旧日的某人 2010-08-18
  • 打赏
  • 举报
回复
//线程好像是这样使?!
Thread thread=new Thread(new ThreadStart(f));
thread.Start();

public Form1()
{
InitializeComponent();
//要加上这个
Form1.CheckForIllegalCrossThreadCalls = false;
}

111,125

社区成员

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

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

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