关于线程调用窗体控件的一个疑问

immc1979 2006-11-03 10:45:34
起因:
在做程序的时候用到了进度条,原来就听说这个需要使用线程,但是我在写代码的时候发现做一个循环给进度条空间反复赋值进度条也是可以动的,但是如果鼠标点击了其他地方或者拖动窗体进度条就不能动了,于是决定改用线程,看了很多使用线程控制进度条的帖子,里面很多都提到了必须使用一个BeginInvoke的方法,其中看到最多的就是 Knight94(愚翁)的http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx
其中就讲到如何使用,例如:
MethodInvoker mi = new MethodInvoker( this.InvokeFun );
但是我根据提供的代码写了个简单的例程想看看在线程中调用控件究竟是如何出错的,代码如下:
private void button1_Click(object sender, System.EventArgs e)
{
Thread thdProcess = new Thread( new ThreadStart( ThreadFun ) );
thdProcess.Start();
}

private void ThreadFun()
{
for( int i = 0; i < 100; i++ )
{
if( this.prgBar.Value < 100 )
{
this.prgBar.Value = prgBar.Value + 1;
this.button1.Text = prgBar.Value.ToString();
}
Thread.Sleep( 100 );
}
}


程序并没有用到委托和MethodInvoker 等,结果程序跑通了,并且并不妨碍用鼠标对窗体的拖动

问题:
为什么这里的线程可以控制到窗体的空件呢?是因为线程函数和窗体的控件事件在同一个类下么?
...全文
197 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
挨踢啊挨踢 2006-11-03
  • 打赏
  • 举报
回复
我前两天刚做完了一个和你类似程序。之后发现了愚翁大哥的文章,但是我的这个简单点。
就是建一个helper类,把进度条对象传到线程里,然后在线程循环里给进度天赋值。我也给愚翁blog上留言了。你可以试试下面这个。
工作线程类:
public class CommissionHelper
{
private System.Windows.Forms.ProgressBar proBar;
public CommissionHelper(System.Windows.Forms.ProgressBar proBar)
{
this.proBar=proBar;
}
public void Run()
{
int i=1;
for()
{
proBar.Value=i;
i=i+1;
}
}
}

主线程窗体按钮调用:
private void btnTransfer_Click(object sender, System.EventArgs e)
{
CommissionHelper helper=new CommissionHelper(proBar);

Thread tdh=new Thread( new ThreadStart( helper.Run ) );

tdh.Start();
}
哦,看到愚翁的回复了。
你也可以到http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx
这里看看关于大漠狂沙的回复。
immc1979 2006-11-03
  • 打赏
  • 举报
回复
o 想起来了,开发平台是2003,数据库用的2005,唉最近睡眠要改善了。。。。
liujia_0421 2006-11-03
  • 打赏
  • 举报
回复
假如你是2003,那显然是可以的...
如果你是2005,那只能解释为你用了这句话:
Thread.Sleep( 100 );

dyw31415926 2006-11-03
  • 打赏
  • 举报
回复
vs2003是可以的, 你的是vs2003还是vs2005呢
liangxf0022 2006-11-03
  • 打赏
  • 举报
回复
顶,但是操作TreeView还有ListView这些就必须用BeginInvoke()
marvelstack 2006-11-03
  • 打赏
  • 举报
回复
try
http://www.codeproject.com/csharp/PIEBALDProgressDialog.asp

110,539

社区成员

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

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

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