2016-07-25 5 views
0

C#では、Windowsフォームアプリケーションを使用して、アイトラッキングプロジェクトに取り組んでいます。アイトラッキングプロセスでは、今までのところ、アイトラッキングデータのヒートマップを作成するなど、必要なものすべてを作成しました。数秒後にスレッドを終了する方法

私のメインフォームには、目の座標をとり、データをデータベースに追加するプログラムを起動する4つのボタン "Start Stream"があります。前のプロセスを終了する「ストップストリーム」。データベースのすべてをクリアする "Clear Database"。また、ヒートマップを作成するためにデータの操作を行う「ヒートマップの作成」もあります。

今私は何かを変更したいです。スタートボタンをクリックすると、プログラムはフルスクリーン上のピクチャボックスを含む新しいフォームを開き、開いた画像をユーザが眺めます。しかし、全画面を注視しながらストリームを止めることはあまりできないので、10秒後にプロセスを停止させたいと思っています。

ストリームを開始するための私のコードは次のとおりです。

flag = true; 

     StreamOnPictureForm newStreamForm = new StreamOnPictureForm(); 
     newStreamForm.Show(); 

//このフォームは中央でのPictureBoxを持つだけで基本的な形です。

 Stream.resetEvent = new ManualResetEvent(false); 
     Thread thread = new Thread(Stream.GazeStream); 
     thread.Start(); 

//これは私の目の動きを読んでDBに追加する主な方法です。

フラグは、プログラムが実行されていることを理解するためのものです。

そして、私は私の「停止ストリーム」ボタンでプロセスを停止します。

if (flag == true) 
     { 
      Stream.resetEvent.Set(); 
     } 
     flag = false; 

今、私が欲しいもの、いずれかのボタンをクリックせずに流れを停止すること、です。私は時間を計算しようとすると、このようなコードでストリームを停止する場合:

DateTime startTime = DateTime.Now; 
     TimeSpan byNow; 
     bool isActive = true; 
     int x; 

     while (isActive == true) 
     { 
      byNow = DateTime.Now.Subtract(startTime); 
      x = (int)byNow.TotalSeconds; 
      if (x > 5) { isActive = false; } 
     } 

     Stream.resetEvent.Set(); 

これは、データが5秒間DBを行う追加開始しますが、私の写真は、その時間後に画面上に示され、画像が最終的に画面に表示されている間、プログラムはもはやユーザーの目からデータを取りません。これは私がしたいことではありません。

スレッドを終了するにはどうすればいいですか(何秒後にデータを追加して画像を閉じるのをやめますか?)誰かが私を助けてくれる?

+1

「スレッドスレッド=新規スレッド」これは従来のコードです。現代版の.NETではこれを行うべきではありません。 'Task'クラスを見てください。 – user3185569

答えて

0

時間をチェックするコードがどこにあるのかはあなたの質問からは分かりませんが、whileループではそのスレッドをロックしています。代わりに、タイマを使用して、5秒が経過したかどうか定期的に確認します(変数に初期時間を格納します)。あなたはスレッドをロックしません。

0

バックグラウンドワーカーとキャンセルトークンを使用してフォームを呼び出すことができます。 キャンセルを送信するまで、フォームは一番上にとどまります。

public partial class TestForm : Form 
{ 
    private CancellationToken token; 

    public TestForm(CancellationToken ct) 
    { 
     InitializeComponent(); 

     this.token = ct; 
     this.BringToFront(); 

     DoBackgroundWork(); 
    } 

    private void DoBackgroundWork() 
    { 
     BackgroundWorker w = new BackgroundWorker(); 
     w.DoWork += w_DoWork; 
     w.RunWorkerCompleted += w_RunWorkerCompleted; 
     w.RunWorkerAsync(); 
    } 

    private void w_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     this.Close(); 
    } 

    private void w_DoWork(object sender, DoWorkEventArgs e) 
    { 
     while (!token.IsCancellationRequested) 
     { 
      // Form stays open 
     } 
    } 
} 

// your start class 
public class TestClass 
{ 
    public void ShowWindowUntilStop() 
    { 
     System.Threading.CancellationTokenSource cts = new System.Threading.CancellationTokenSource(); 
     TestForm t = new TestForm(cts.Token); 
     t.Show(); 

     // do some work 

     cts.Cancel(); 
    } 
} 
関連する問題