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同时执行?

解决方案 »

  1.   

    楼主试试这个 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还是去主进程中调用的,所以他们又排队了,应该看看高手解答。
      

  2.   

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

  3.   

    这会报错啊,“线程间操作无效: 从不是创建控件“progressBar1”的线程访问它”。
      

  4.   

    设置Control类的一个静态属性可以解决楼上的问题,具体是什么我忘了,楼上可以查查MSDN