在一个函数中计数3秒

本文关键字:3秒 函数 一个 | 更新日期: 2023-09-27 18:24:12

我的程序中有一个事件,其中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之间。持续三秒。我认为定时器是一个很好的方法,因为它可以防止我的应用程序在所有这些计算过程中冻结,因为它会进入一个单独的线程

在一个函数中计数3秒

计时器是无用的,因为您会轮询太多次,并错过更改/回改。

您必须封装变量的设置。通过这种方式,您可以响应变量的更改。

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。现在要获取时间,它不如Stopwatch类准确。

代码:

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;  
        }
    }

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