【发布时间】:2013-07-04 16:08:06
【问题描述】:
这是我第一次遇到这样的问题。这不是我的职业,只是我的爱好,我没有以前的参考资料。 在我的程序中,我一一添加了几个功能来控制机器。添加最后一个功能(温度测量)后,我开始在其他功能上遇到问题(其中大约 8 个一起运行。我遇到的问题在与此无关的图表(电机的 RPM)上功能但受它的影响。您可以看到这两个图表在运行和不运行温度测量时的区别。两个图表中电机的实际速度相同,但在第二个图表中,由于应用程序变慢,我在运行中松散了碎片下来。
没有温度功能。 带温度功能
特别是这个功能干扰了上述控制,我认为是因为应用程序的工作量变得越来越重,或者因为我需要采样,所以有一些时间等待获得它们:
private void AddT(decimal valueTemp)
{
sumTemp += valueTemp;
countTemp += 1;
if (countTemp >= 20) //take 20 samples and make average
{
OnAvarerageChangedTemp(sumTemp / countTemp);
sumTemp = 0;
countTemp = 0;
}
}
private void OnAvarerageChangedTemp(decimal avTemp)
{
float val3 = (float)avTemp;
decimal alarm = avTemp;
textBox2.Text = avTemp.ToString("F");
if (alarm > 230)
{
System.Media.SoundPlayer player = new System.Media.SoundPlayer();
player.Stream = Properties.Resources.alarma;
player.Play();
timer4.Start();
}
else
{
timer4.Stop();
panel2.BackColor = SystemColors.Control;
}
}
我想知道在不同的线程上运行这个函数是否可以解决问题,我该怎么做?或者如果有其他方法可以解决问题。示例代码将不胜感激。
更新,添加方法调用。
这就是我调用 AddT 方法的方式
if (b != "")
{
decimal convTemp; //corrente resistenza
decimal.TryParse(b, out convTemp);
AddT(convTemp);}
This 是我从串行接收数据并将其传递给去除不常见字符并将值返回给不同变量的类的方式。 This 是去除不常见的字符并返回值的类。 this 是我管理串行传入数据的方式。看到我的编码后请不要嘲笑我。我做不同的工作,我正在自学。
【问题讨论】:
-
你为什么使用十进制?如何“控制机器”? AddT 怎么称呼?为什么你认为它太慢了?
-
首先找出你真正的问题。如果 CPU 负载太高,您应该获得更少的值,但不会出现错误(较低)的值。您的症状不支持您的假设。
-
很难从您发布的内容中看出,但您确实在 UI 线程中做得太多了。例如,我有线程来收集数据。用于监视警报数据的线程。然后根据我检测到的感兴趣的内容,在需要时更新 UI(或其部分)的线程。
-
好吧,看起来还不错(没什么明显的)。您是否尝试过省略其他功能并查看它是否再次开始工作?还要检查 CPU 负载(如果它真的太高)。您多久从 Arduino 获取数据?
-
我没有答案,但我确实发现了一些可疑的东西。在读取 rpm 值的代码(pastebin 链接)中,您将用空字符串替换出现的“0”。我不确定您是否正在考虑那里的前导零,但这不会将“30”的读数更改为“3”吗?等等……
标签: c# multithreading backgroundworker