请高手帮忙解决VS.net2005多线程处理

lichunloverit 2007-02-14 04:22:59
private delegate void dodelegate(System.Windows.Forms.ProgressBar pb);
private void button4_Click(object sender, EventArgs e)
{
dodelegate mydo = new dodelegate(doit);
mydo.BeginInvoke(progressBar1, null, null);
}
private void doit(System.Windows.Forms.ProgressBar pb)
{
pb.Minimum = 0;
pb.Maximum = 100;
pb.Step = 1;
pb.Value = 0;
for (int i = 0; i < 100; i++)
{
pb.Value = pb.Value + 1;
System.Threading.Thread.Sleep(200);
}
}
执行button4_click代码时,返回错误:
线程间操作无效: 从不是创建控件“pb”的线程访问它
请高手帮我解决一下,谢谢
...全文
299 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
rroo 2007-02-15
  • 打赏
  • 举报
回复
用下面的方法就不会发生假死了
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button4_Click(object sender, EventArgs e)
{
Worker worker = new Worker();
worker.ProcessEvent += new ProcessEventHandler(worker_ProcessEvent);
worker.Start();
}

private void worker_ProcessEvent(int count)
{
this.Invoke(new ProcessEventHandler(this.ShowProcess), new object[] { count });
}

private void ShowProcess(int count)
{
progressBar1.Value = count;
}
}

public delegate void ProcessEventHandler(int count);
public class Worker
{
public event ProcessEventHandler ProcessEvent = null;

public void Start()
{
Thread thread = new Thread(new ThreadStart(delegate()
{
for (int i = 0; i < 100; i++)
{
if (ProcessEvent != null)
{
ProcessEvent(i);
}
Thread.Sleep(200);
}
}));
thread.IsBackground = true;
thread.Start();
}
}
}
rroo 2007-02-15
  • 打赏
  • 举报
回复
public partial class Form1 : Form
{
private delegate void dodelegate(System.Windows.Forms.ProgressBar pb);
public Form1()
{
InitializeComponent();
}

private void button4_Click(object sender, EventArgs e)
{
dodelegate mydo = new dodelegate(doit);
this.Invoke(mydo, new object[] { progressBar1 });
}

private void doit(System.Windows.Forms.ProgressBar pb)
{
pb.Minimum = 0;
pb.Maximum = 100;
pb.Step = 1;
pb.Value = 0;
for (int i = 0; i < 100; i++)
{
pb.Value = pb.Value + 1;
System.Threading.Thread.Sleep(200);
}
}
}
不过这样写窗体会假死
lichunloverit 2007-02-15
  • 打赏
  • 举报
回复
有没有人知道怎么改写上述代码,万分感谢。
xuxiaoyang520yp 2007-02-14
  • 打赏
  • 举报
回复
up
lichunloverit 2007-02-14
  • 打赏
  • 举报
回复
请问高人上述代码如何改写才对,请指教
rroo 2007-02-14
  • 打赏
  • 举报
回复
先看看这篇文章,我回答部分
http://community.csdn.net/Expert/topic/5339/5339904.xml?temp=.8979608
f_c_sh 2007-02-14
  • 打赏
  • 举报
回复
线程中不能直接给控件赋值,需要调用控件的Invoke方法
lichunloverit 2007-02-14
  • 打赏
  • 举报
回复
private delegate void dodelegate(System.Windows.Forms.ProgressBar pb);
dodelegate mydo = null;
private void doit(System.Windows.Forms.ProgressBar pb)
{
if (progressBar1.InvokeRequired)
{
pb.Minimum = 0;
pb.Maximum = 100;
pb.Step = 1;
pb.Value = 0;
for (int i = 0; i < 100; i++)
{
pb.Value = pb.Value + 1;
System.Threading.Thread.Sleep(200);
}
}
}
private void button4_Click(object sender, EventArgs e)
{
mydo = new dodelegate(doit);
mydo.BeginInvoke(progressBar1,null,null);
}
progressbar1为一个窗体上的控件,但是在执行时,仍然报线程间操作无效: 从不是创建控件“progressBar1”的线程访问它,有高手能解答吗,谢谢!最好能贴出代码片断
lichunloverit 2007-02-14
  • 打赏
  • 举报
回复
是阻塞的,我需要非阻塞的,要求像多线程的一样的效果
lizhizhe2000 2007-02-14
  • 打赏
  • 举报
回复
线程间直接操作是无效,可以用一个代理
主线程:
第一步:定义委托delegate
private delegate void setConn(string strConn);
private setConn mySetConn = null;
第二步:定义一个方法
private void DispText(string strConn)
{
textBox1.Text = strConn;
}
第三步:初始化委托
mySetConn = new setConn(this.DispText);
第四步:在工作线程中
this.Invoke(mySetConn, "把我显示在textBox1中,谢谢!");

110,567

社区成员

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

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

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