我的程序中有一个事件,其中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之间,持续三秒钟。我虽然计时器是一个很好的方法,因为它会阻止我的应用程序在所有这些计算过程中冻结,因为它进入一个单独的线程。 : - /
答案 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秒的时间段:
在TanThetaWentOutOfBounds处理程序(注册该事件的其他一些类)中,跟踪上一次更新的时间,并仅在测量开始后3秒内引发事件时采取操作。通过这种方式,实施这一时期的责任将提供给消费者。
您可以决定仅在上次提升事件后经过的时间少于3秒时才举起活动。这样,您可以将所有消费者限制在您在提升者中实施的期间。请注意,我使用DateTime.Now来获取时间,这不如秒表类准确。
代码:
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
对象。