我需要实现一个适应变量变化率的算法。假设我有一个整数HumidityPercent和一个外部传感器实时提供数据。 我发现了几种检测我的var是否发生变化的方法:
private float HumChange
{
get { return HumidityPercent; }
set
{
HumidityPercent = value;
if (HumidityPercent != 100)
{
// Do what?
}
}
}
我有一个计时器(秒表)来计算通过的毫秒数。事情是:我如何调用新变量中的更改来存储毫秒和新值?
private double newHum = (HumidityPercent, timer.TotalMilliseconds);
但在那之后我怎么能区分?
任何帮助都将不胜感激。
答案 0 :(得分:1)
如果您需要变化率,那么您需要做三件事:
如果你有一个计时器在运行,那么第一次点火时它需要做的就是储存湿度。
下次触发时,需要将“当前”值移动到“上一个”值,更新“当前”值并进行变化率计算。
因此,如果你将你的值作为可以为空的双打,你可以测试你是否有以前的值:
private double? previous;
private double current;
private double rateOfChange;
private void TimerTick(....)
{
if (previous == null)
{
current = GetHumidity();
}
else
{
previous = current;
current = GetHumidity();
rateOfChange = (current - previous) / time;
}
}
答案 1 :(得分:1)
经过彻底的搜索(以及我身边的大量学习)后,我建立了@ChrisF代码,并制作了一个高效优雅的狙击手。
public void InitTimer()
{
timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Elapsed += timer_Tick;
timer.Interval = 200;
}
public void timer_Tick(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Enabled = false;
System.Threading.Interlocked.Increment(ref current);
if (current == 0)
{
current = HumidityPercent;
}
else
{
previous = current;
current = HumidityPercent;
RateOfChange = (current-previous)/5;
Thread.Sleep(200);
}
timer.Enabled = true;
}
注意到我必须调用一次InitTimer方法,所以我使用了:
if (firstrun == true)
{
InitTimer();
firstrun = false;
}
另请注意,我已将tick放在stop-start事件中,放入Thread.Sleep并添加了非常方便有效的System.Threading.Interlocked.Increment(ref current)。
谢谢大家的贡献!