2016-07-25 60 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(); 
    } 
}