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同时执行?
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同时执行?
{
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还是去主进程中调用的,所以他们又排队了,应该看看高手解答。
给你讲下思路,
定义一个 AutoResetEvent[] ProcessSignals; 这样的信号量(全局),有2个线程2个成员就够了在线程的处理过程中,选定你要实现同步的点
使用如下语句
ProcessSignals[0].Set(); //另一个线程中则是ProcessSignals[1],这句表示当前线程已经完成本期任务就绪了
WaitHandle.WaitAll(ProcessSignals); //这句表示要等到2个信号量都set了(也就是在等【1】的这个信号量),才继续往下,否则阻塞当前线程-----------------------------
注意:ProcessSignals这玩意set之后,会自动reset的,所以不用手工再去reset(),线程再次运行到这里的时候又会阻塞.
只有思路,还需要你自己调试。