线程同步的问题

kkkbbnnn 2010-09-16 12:34:43
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System .Threading ;

namespace Multitread
{
/// <summary>
/// Description of MainForm.
/// </summary>
///
public delegate void IncreaseValue();
public partial class MainForm : Form
{
private Thread one;
private Thread two;
public MainForm()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();

//
// TODO: Add constructor code after the InitializeComponent() call.
//
}
private void start1()
{
this .Invoke(new IncreaseValue (IncreaseProcessBar1Value ));
}
private void start2()
{
this .Invoke(new IncreaseValue (IncreaseProcessBar2Value ));
}

void Button1Click(object sender, EventArgs e)
{

}
protected void IncreaseProcessBar1Value()
{
for(int i = 0;i<100;i++)
{
System .Threading .Thread .Sleep (100);
progressBar1 .Value +=1;
}

}

void Button3Click(object sender, EventArgs e)
{
one = new Thread (new ThreadStart (start1 ));
two = new Thread (new ThreadStart (start2 ));

one .Start ();
two .Start ();
}
protected void IncreaseProcessBar2Value()
{
for(int i = 0;i<100;i++)
{
System .Threading .Thread .Sleep (100);
progressBar2 .Value +=1;
}

}

void Button2Click(object sender, EventArgs e)
{

}
}
}

求教怎样使线程one和线程two同时执行?
...全文
232 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzjxylophone 2010-09-16
  • 打赏
  • 举报
回复
关注。。。
volunteergg 2010-09-16
  • 打赏
  • 举报
回复
设置Control类的一个静态属性可以解决楼上的问题,具体是什么我忘了,楼上可以查查MSDN
kkkbbnnn 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 symbol_bc 的回复:]

楼主试试这个
C# code

public partial class MainForm : Form
{
private Thread one;
private Thread two;

public MainForm()
{
InitializeComponent();
}……
[/Quote]
这会报错啊,“线程间操作无效: 从不是创建控件“progressBar1”的线程访问它”。
大飞飞虫 2010-09-16
  • 打赏
  • 举报
回复
让2线程时时同步是很难的。不过你可以让2线程在处理某些事务时间点后同步。
给你讲下思路,
定义一个 AutoResetEvent[] ProcessSignals; 这样的信号量(全局),有2个线程2个成员就够了

在线程的处理过程中,选定你要实现同步的点
使用如下语句
ProcessSignals[0].Set(); //另一个线程中则是ProcessSignals[1],这句表示当前线程已经完成本期任务就绪了
WaitHandle.WaitAll(ProcessSignals); //这句表示要等到2个信号量都set了(也就是在等【1】的这个信号量),才继续往下,否则阻塞当前线程

-----------------------------
注意:ProcessSignals这玩意set之后,会自动reset的,所以不用手工再去reset(),线程再次运行到这里的时候又会阻塞.
只有思路,还需要你自己调试。
symbol_bc 2010-09-16
  • 打赏
  • 举报
回复
楼主试试这个

public partial class MainForm : Form
{
private Thread one;
private Thread two;

public MainForm()
{
InitializeComponent();
}

protected void IncreaseProcessBar1Value()
{
for (int i = 0; i < 100; i++)
{
System.Threading.Thread.Sleep(100);
progressBar1.Invoke(new Action(start1));
}

}

protected void IncreaseProcessBar2Value()
{
for (int i = 0; i < 100; i++)
{
System.Threading.Thread.Sleep(100);
progressBar1.Invoke(new Action(start2));
}

}

private void start1()
{
progressBar1.Value += 1;
}
private void start2()
{
progressBar2.Value += 1;
}

private void button1_Click(object sender, EventArgs e)
{

one = new Thread(new ThreadStart(IncreaseProcessBar1Value));
two = new Thread(new ThreadStart(IncreaseProcessBar2Value));

one.Start();
two.Start();
}
}


这样两个线程能同时执行,但是具体的原因我也说不太明白,感觉你调用的时候

private void start1()
{
this .Invoke(new IncreaseValue (IncreaseProcessBar1Value ));
}
private void start2()
{
this .Invoke(new IncreaseValue (IncreaseProcessBar2Value ));
}

this.invoke还是去主进程中调用的,所以他们又排队了,应该看看高手解答。

111,129

社区成员

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

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

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