2016-07-25 55 views
0

在c#中,我正在使用Windows窗體應用程序工作我的眼動跟蹤項目。對於眼動追蹤過程,到目前爲止,我已經創建了所有需要的東西 - 包括創建眼動追蹤數據的熱圖(heatmap) - 並且我現在正在處理我的界面。如何在幾秒鐘後結束線程

在我的主窗體上,有4個按鈕「啓動流」,它啓動程序,它採用眼睛的座標並將數據添加到數據庫中。 「停止流」結束前一個過程。 「清除數據庫」清除數據庫中的所有內容。和「創建熱圖」,它對數據進行一些操作以創建熱圖。

現在我想改變一些東西。通過點擊開始按鈕,程序會在全屏上打開一個帶有圖片框的新表單,用戶會注視打開的圖片。但是,由於不可能在觀看全屏時停止流,所以我想讓流程在停止之後停下來,比如說10秒。

我開始流代碼:

flag = true; 

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

//這種形式只是一種基本形式,在中心一個PictureBox。

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

//這是我閱讀眼球運動的主要方法,並將它們添加到數據庫中。

該標誌用於理解程序正在運行。

而且我停止的過程與我「停止流」按鈕:

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

'Thread thread = new Thread'這是遺留代碼。你不應該在.NET的現代版本中這樣做。看看「任務」類。 – 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(); 
    } 
}