在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秒,但是在这段时间后我的图片显示在屏幕上,当图片最终显示在屏幕上时,程序不再从用户的眼睛中获取数据,这不是我想做的。
如何结束我的线程(几秒钟后停止拍摄并添加数据,并关闭图片)?有人可以帮帮我吗?
答案 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();
}
}