带有全局变量的C#中的计时器?

时间:2016-04-01 10:26:01

标签: c# timer global-variables

我在下面的代码中遇到了一些问题。

当应用程序运行时,只要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

2 个答案:

答案 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秒调用此方法。