如何在几秒钟后结束一个线程

时间:2016-07-25 08:59:50

标签: c# multithreading

在c#中,我正在使用Windows窗体应用程序处理我的眼动追踪项目。对于眼动追踪过程,到目前为止,我已经创建了所需的一切 - 包括创建眼动追踪数据的热图 - 我现在正在我的界面上工作。

在我的主窗体上,有4个按钮“Start Stream”启动程序,该程序采用眼睛坐标并将数据添加到数据库中。 “停止流”结束前一个过程。 “清除数据库”清除数据库中的所有内容。并且“创建热图”对数据进行一些操作以创建热图。

现在我想改变一些事情。通过单击开始按钮,程序将打开一个带有全屏图片框的新表单,用户可以看到打开的图片。但是,由于在全屏注视时不太可能停止流,我想让这个过程自动停止,让我们说10秒。

我的启动代码是:

flag = true;

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

//此表单只是一个基本表单,中间有一个图片框。

        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秒,但是在这段时间后我的图片显示在屏幕上,当图片最终显示在屏幕上时,程序不再从用户的眼睛中获取数据,这不是我想做的。

如何结束我的线程(几秒钟后停止拍摄并添加数据,并关闭图片)?有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:0)

从您的问题中可以清楚地看出检查时间的代码位于何处,但是您的方式(使用while循环),您将在一段时间内锁定该线程。相反,使用计时器定期检查是否已经过了5秒(将初始时间存储在变量中);那样你就不会锁定线程。

答案 1 :(得分: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();
    }
}