在一个函数内计算3秒

时间:2012-02-10 05:22:06

标签: c# wpf

我的程序中有一个事件,其中tantheta的值会随后发生更改。

问题是我必须检查tantheta的这个值是否在0.6 to 1.5的某个范围内保持3秒钟。

我尝试了一些计时器,但没有成功。有什么建议吗?

编辑 -

DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();
//This event is fired automatically 32 times per second.
private void SomeEvemt(object sender, RoutedEventArgs e)
{
tantheta = ; tantheta gets a new value here through some calculation

timer.Tick += new EventHandler(timer_Tick);
timer.Interval = new TimeSpan(0, 0, 5);
timer.Start();
//if condition to check if tantheta is within range and do something

}

void timer_Tick(object sender, EventArgs e)
        {
            DispatcherTimer thisTimer = (DispatcherTimer)sender;
            textBox1.Text = thisTimer.Interval.ToString();
            thisTimer.Stop();
            return;
        }

我必须检查tantheta值是否保持在0.6到1之间,持续三秒钟。我虽然计时器是一个很好的方法,因为它会阻止我的应用程序在所有这些计算过程中冻结,因为它进入一个单独的线程。 : - /

2 个答案:

答案 0 :(得分:2)

计时器没用,因为您将轮询太多次并错过更改/更改。

您必须封装变量的设置。 这样您就可以响应变量的变化。

class A
{
    private double _tantheta; // add public getter
    private bool _checkBoundaries; // add public getter/setter
    public event EventHandler TanThetaWentOutOfBounds;
    public void SetTantheta(double newValue)
    {
        if(_checkBoundaries &&
            (newValue < 0.6 || newValue > 1.5))
        {
            var t = TanThetaWentOutOfBounds;
            if(t != null)
            {
                t(this, EventArgs.Empty);
            }
        }
        else
        {
            _tantheta = newValue;  
        }
    }

现在您所要做的就是订阅此类的TanThetaWentOutOfBounds事件,并将CheckBoundaries设置为true或false。

请注意,此代码不会修复任何多线程问题,因此您可能需要添加一些锁定,具体取决于您对该类的使用。

有两种方法可以处理3秒的时间段:

  1. 在TanThetaWentOutOfBounds处理程序(注册该事件的其他一些类)中,跟踪上一次更新的时间,并仅在测量开始后3秒内引发事件时采取操作。通过这种方式,实施这一时期的责任将提供给消费者。

  2. 您可以决定仅在上次提升事件后经过的时间少于3秒时才举起活动。这样,您可以将所有消费者限制在您在提升者中实施的期间。请注意,我使用DateTime.Now来获取时间,这不如秒表类准确。

  3. 代码:

    class A
    {
        private double _tantheta; // add public getter
        private DateTime _lastRaise = DateTime.MinValue;
        private bool _checkBoundaries; // add public getter/setter
        public event EventHandler TanThetaWentOutOfBounds;
        public void SetTantheta(double newValue)
        {
            if(_checkBoundaries &&
                (newValue < 0.6 || newValue > 1.5))
            {
                var t = TanThetaWentOutOfBounds;
                if(t != null)
                {
                    var now = DateTime.Now;
                    if((now - _lastRaise).TotalSeconds < 3)
                    {
                        t(this, EventArgs.Empty);
                        _lastRaise = now;
                    }
                }
            }
            else
            {
                _tantheta = newValue;  
            }
        }
    

答案 1 :(得分:0)

我的猜测是你需要一个跟踪上次调用函数的函数之外的变量。这样你就可以查看自上次通话以来是否已经过了3秒。不需要Timer对象。