在一个函数中计数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之间。持续三秒。我认为定时器是一个很好的方法,因为它可以防止我的应用程序在所有这些计算过程中冻结,因为它会进入一个单独的线程
计时器是无用的,因为您会轮询太多次,并错过更改/回改。
您必须封装变量的设置。通过这种方式,您可以响应变量的更改。
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秒周期:
在TanThetaWentOutOfBounds处理程序(为事件注册的其他类)中,跟踪上一次更新的时间,只有在测量开始后3秒内引发事件时才采取行动。通过这种方式,将实施该期限的责任交给了消费者。
只有在距离上次引发事件不到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
对象。