2016-07-13 2 views
-2

Für den Kontext: Ich möchte zur "gleichen Zeit" ein EMG und eine Kamera starten.Machen Sie einen Thread zu warten, bis die Schaltfläche geklickt wird

Es sieht wie folgt aus:

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

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

Und dann fange ich an die Kamera und das EMG, wenn ich auf einen Knopf klicken:

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

     } 

Mein großes Problem ist hier initialiazing die EMG nehmen ziemlich lange Zeit (einige Sekunden ...). Also gibt es eine große Lücke zwischen der Kamera und dem EMG Aufnahme-Start. Dann möchte ich die emg.Start() & die Camera.start zur "gleichen Zeit" starten.

Ich möchte nicht camera.start auf meine EMG-Klasse setzen.

Ich habe versucht, emg.initialize und emg.RecordStart in zwei separate Lücke zu trennen, aber es ist unmöglich Es funktioniert nur, wenn sie beide in der gleichen Lücke mit EMG emg = new EMG(); sind.

Ich kann nicht‘legte einen await task.run mit emg.start

Der beste Weg wäre, bevor EMG-Klasse zu starten, ist es einfach machen warten, bevor der emg.start, bis ich auf den Button klicken. Lasse diesen Thread warten und starte ihn dynamisch mit der Schaltfläche.

Oder vielleicht machen t1 starten, wenn emg.initialize fertig ist, wäre einfacher.

Vielen Dank.

Antwort

1

Sie könnten versuchen, ein WaitHandler wie ManulResetEvent für die Synchronisation zu verwenden. Ich denke, es ist wichtig, dass der gleiche Thread Initialize und Start auf dem EMG aufruft.

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(); 
} 
+0

genau die Art von Code, den ich danke müssen nicht getestet, aber arbeiten. Kleines Problem, obwohl es sagte "MAnualResetEvent enthält keinen Konstruktor, der 0 Argumente." ... weiß nicht, wie ich das beheben soll: s – jsls

+1

Ich habe den Code aktualisiert – Michael

+0

Sie sollten vielleicht auch in cancellationTokens schauen, um es wieder zu stoppen, falls die Schaltfläche nie geklickt wird? – Michael

0

Uhm ... versuchen Sie die folgende

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() 
    } 
    ... 
} 

sollte

Verwandte Themen