使线程等到按钮被单击

时间:2016-07-13 13:32:45

标签: c#

对于上下文:我想在EMG和相机的“同一时间”开始。

看起来像这样:

Public class EMG
{
 public void startemg()
  {
    EMG emg = new EMG();
    emg.Initialize();  //takes a lot of time 

    emg.Start();
   [...]
   }
}

然后当我点击按钮时启动相机和EMG:

private void button2_Click(object sender, EventArgs e)
        {   
            Task t = new Task(EMG.startemg);
            Task t1 = new Task(Camera.start)
            t.Start();
            t1.Start();

        }

我最大的问题是初始化EMG需要相当长的时间(几秒钟......)所以我的相机和EMG的采集开始之间存在很大的差距。然后我想开始emg.Start()& Camera.start在“同一时间”。

我不想将camera.start放在我的EMG课上。

我尝试将emg.initializeemg.RecordStart分成两个单独的空格,但这是不可能的只有当它们与EMG emg = new EMG();在同一个空白中时才有效。

我无法将await task.run与emg.start

放在一起

最好的方法是先启动EMG课程,让它在emg.start之前等待,直到我点击按钮。使该线程等待并使用该按钮动态启动它。

或者在t1完成后让emg.initialize开始会更容易。

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用像ManulResetEvent这样的WaitHandler进行同步。我猜测同一个线程在EMG上调用Initialize和Start是很重要的。

public class EMG
{
  private ManualResetEvent waitHandler = new ManualResetEvent(false);

  public void Initialize()
  {
    EMG emg = new EMG();
    emg.Initialize();  //takes a lot of time 
    waitHandler.WaitOne();
    emg.Start();
  }

  public void Start()
  {
     waitHandler.Set();
  }
}
private void button2_Click(object sender, EventArgs e)
{   
  Task cameraTask = new Task(Camera.start)
  cameraTask .Start();
  EMG.Start();
}

答案 1 :(得分:0)

嗯...尝试以下

public class EMG
{
  // Local variable
  EMG emg = new EMG();

  // Task to hod init process
  Task cameraInitTasks;

  public EMG():base()
  {
    InitMyOtherStuff(); // Other init code

    // Create your task on class initialization
    cameraInitTasks = new Task(EMG.startemg);

    // Start it
    cameraInitTasks.Start();

  }

  public button2_Click()
  {
     // jic, wait until task finished
     cameraInitTasks.Wait();

     // This one should take little time, right?
     emg.Start();

     // Go and take the picture
     DoPictureTake()
  }
  ...
}

未经测试但应该正常工作