起因:
在做程序的时候用到了进度条,原来就听说这个需要使用线程,但是我在写代码的时候发现做一个循环给进度条空间反复赋值进度条也是可以动的,但是如果鼠标点击了其他地方或者拖动窗体进度条就不能动了,于是决定改用线程,看了很多使用线程控制进度条的帖子,里面很多都提到了必须使用一个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 等,结果程序跑通了,并且并不妨碍用鼠标对窗体的拖动问题:
为什么这里的线程可以控制到窗体的空件呢?是因为线程函数和窗体的控件事件在同一个类下么?
在做程序的时候用到了进度条,原来就听说这个需要使用线程,但是我在写代码的时候发现做一个循环给进度条空间反复赋值进度条也是可以动的,但是如果鼠标点击了其他地方或者拖动窗体进度条就不能动了,于是决定改用线程,看了很多使用线程控制进度条的帖子,里面很多都提到了必须使用一个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 等,结果程序跑通了,并且并不妨碍用鼠标对窗体的拖动问题:
为什么这里的线程可以控制到窗体的空件呢?是因为线程函数和窗体的控件事件在同一个类下么?
解决方案 »
- 怎样让DAL层的三个方法可以单独调用,也可以放到一个事务中一起调用?
- dsoframer无法打开含有三个以上Sheet的Excel文件...急用、求救
- 窗体没有焦点,向其发送消息,发送的是快捷键 但是发送了,快捷键消息没有反应,是不是快捷键必须要有焦点的时侯。发送快捷键才起作用啊!!(我没有分,可以吗?)
- system.timers.timer执行问题。
- 问一个弱弱的问题,ADO.NET中没有类似ADO的添加记录的“AddNew”方法
- dataset数据的删除问题
- 100分求一个C#做的体育比赛的控制软件源码
- 大家谁能给我一个“汉诺塔”的递归程序
- Windows Media Player控件在系统托盘恢复后不能正常工作了
- 关于软件自动更新的问题
- 求一个验证SQL语句是否合法的正则式~~
- Microsoft.ApplicationBlocks.Cache源带码
如果你是2005,那只能解释为你用了这句话:
Thread.Sleep( 100 );
就是建一个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
这里看看关于大漠狂沙的回复。
http://www.codeproject.com/csharp/PIEBALDProgressDialog.asp