我在下面的代码中遇到了一些问题。
当应用程序运行时,只要LookingAwayResult.Text = "Yes"
,计时器启动并计数到10.当LookingAwayResult.Text = "No"
或"Maybe"
时,计时器应该停止并再次重置为0,但是这不是。
当计时器达到10时,会出现一个消息框,这是我想要的,但这将继续显示并垃圾邮件我的屏幕。在消息框出现后,计时器将重置为0,并且在消息框中选择要冻结的应用程序直到“确定”。
好像我的代码循环所有的计时器,这不是我想要的。
private void OnFaceFrameArrived(object sender, FaceFrameArrivedEventArgs e)
{
// Retrieve the face reference
FaceFrameReference faceRef = e.FrameReference;
if (faceRef == null) return;
// Acquire the face frame
using (FaceFrame faceFrame = faceRef.AcquireFrame())
{
if (faceFrame == null) return;
// Retrieve the face frame result
FaceFrameResult frameResult = faceFrame.FaceFrameResult;
// Display the values
HappyResult.Text = frameResult.FaceProperties[FaceProperty.Happy].ToString();
EngagedResult.Text = frameResult.FaceProperties[FaceProperty.Engaged].ToString();
GlassesResult.Text = frameResult.FaceProperties[FaceProperty.WearingGlasses].ToString();
LeftEyeResult.Text = frameResult.FaceProperties[FaceProperty.LeftEyeClosed].ToString();
RightEyeResult.Text = frameResult.FaceProperties[FaceProperty.RightEyeClosed].ToString();
MouthOpenResult.Text = frameResult.FaceProperties[FaceProperty.MouthOpen].ToString();
MouthMovedResult.Text = frameResult.FaceProperties[FaceProperty.MouthMoved].ToString();
//initilize look away timer for 10 seconds
Timer lookAwayTimer = new Timer(interval: 10000);
//inialize the poll tiomer for 50 ms
Timer pollTimer = new Timer(interval: 50);
LookingAwayResult.Text = frameResult.FaceProperties[FaceProperty.LookingAway].ToString();
//if 10 seconds expires then show message box
lookAwayTimer.Elapsed += (s, f) =>
{
MessageBox.Show("Looking is set to yes", "Looking Error", MessageBoxButton.OK);
};
//enable poll timer
pollTimer.Enabled = true;
//check if person is looking. If they are not then enable the lookAwayTimer. If they start looking
//then disable the timer
pollTimer.Elapsed += (s, f) =>
{
Check = frameResult.FaceProperties[FaceProperty.LookingAway].ToString();
if (Check == "Yes")
{
lookAwayTimer.Enabled = true;
}
else
{
lookAwayTimer.Enabled = false;
}
};
}
}
我所追求的是在人没有观察并停止后运行计时器,并在该人再次观看时重置为0。
当计时器达到10秒时,将出现消息框并且应用程序冻结。用户必须为此框选择“确定”才能消失,并且应用程序将重置为默认值。
从研究中,我相信使用全局变量或模态框会在这里派上用场吗?
我相信使用模态框会冻结我的应用程序,直到用户对其执行操作为止?但是这仍然无法解决我的问题,计时器没有重置为0并希望应用程序在选择“确定”后完全重置。
我还想知道除非必要,否则应避免使用C#中的全局变量。
如果模态框是部分答案,我是否只需将MessageBox.Show
更改为ShowDialog
?
答案 0 :(得分:0)
从您的问题中可以清楚地看到,您没有控制点击消息框按钮的任何操作。您可能只显示消息框以通知用户。
因此,为了使代码在执行时不要暂停,请在different thread
上创建消息框,这样就不会停止执行。
以下代码在单独的线程上创建一个消息框。
public class ThreadIndependentMB
{
private readonly Dispatcher uiDisp;
private readonly Window ownerWindow;
public ThreadIndependentMB(Dispatcher UIDispatcher, Window owner)
{
uiDisp = UIDispatcher;
ownerWindow = owner;
}
public MessageBoxResult Show(string msg, string caption="",
MessageBoxButton buttons=MessageBoxButton.OK,
MessageBoxImage image=MessageBoxImage.Information)
{
MessageBoxResult resmb = new MessageBoxResult();
if (ownerWindow != null)
uiDisp.Invoke(new Action(() =>
{
resmb = MessageBox.Show(ownerWindow, msg, caption, buttons, image);
}));
else
uiDisp.Invoke(new Action(() =>
{
resmb = MessageBox.Show( msg, caption, buttons, image);
}));
return resmb;
}
}
在您的计时器中,您可以实例化该类并调用该类的Show方法。
答案 1 :(得分:0)
计时器上的AutoReset属性可以解决您的问题:
System.Timers.Timer lookAwayTimer = new System.Timers.Timer(10000)
{
AutoReset = false
};
lookAwayTimer.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) =>
{
pollTimer.Stop();
MessageBox.Show("Looking is set to yes", "Looking Error", MessageBoxButtons.OK);
lookAwayTimer.Start();
pollTimer.Start();
};
将此设置为false将导致计时器经过一次然后停止重复(因此它不会对您的屏幕发送垃圾邮件),直到您再次启动它为止 - 默认为true,因此它将保持自动重置并每隔10秒调用此方法。