这是我第一次遇到这样的问题。这不是我的职业,而只是我的爱好,我没有以前的引用资料。 在我的程序中,我一个一个地添加了几个功能来控制一台机器。添加最后一个功能(温度测量)后,我开始在其他功能上遇到问题(大约有 8 个功能一起运行。我遇到的问题出现在与此无关的图表(电机转速)上功能,但受其影响。你可以看到这两个图表在运行和不运行温度测量时的区别。电机的实际速度在两个图表中是相同的,但在第二个图表中,我在运行中丢失了一些部件,因为应用程序变慢了下。
没有温度功能。 具有温度功能
特别是这个函数干扰了上面的控制,我认为是因为应用程序的工作负载变得很重,或者因为我需要采样所以有一些时间等待它们:
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是我管理串行传入数据的方式。请不要在看到我的编码后笑话我。我从事不同的工作,我正在自学。
最佳答案
很难判断是否有任何问题以及可能是什么问题 - 它看起来像是一个微妙的问题。
但是,如果您重构代码,可能更容易处理这些事情。您展示的代码中有很多东西使得推断正在发生的事情变得比必要的更难。
- 您正在使用
float
和decimal
-float
不是那么准确,但又小又快;decimal
(尝试)是精确的,但特别是可预测的,因为它以人类可能以 10 为基数的方式舍入错误 - 但它非常慢,并且通常用于需要精确再现性的计算(例如财务资料)。您可能应该在任何地方都使用double
。 Stripper
类中有无用的else {}
代码。- 您的
Stripper
是一个不可初始化的类,而它应该只是一个带有静态方法的静态类 -Stripper
是无状态的。 - 您捕获异常只是为了重新抛出它们。
- 您正在使用
TryParse
,并且没有检查是否成功。通常,如果您 (a) 预计解析有时会失败,和 (b) 可以处理该解析失败,那么您只会使用 TryParse。如果您不期望失败或无法处理失败,那么您最好尽快了解崩溃,而不是轻微错误的值(value)观。 - 在 stripper 中,您复制了
_currentMot
、currentMot
和param4
等变量,但它们是相同的 - 仅使用参数, 并给它起一个合乎逻辑的名字。 - 您正在使用
out
参数。定义一个简单的struct
并返回它几乎总是一个更好的主意——这也使您可以确保您不会轻易混淆变量名,并且封装和重用功能要容易得多,因为您不需要重复长调用和参数定义。 - 您的字符串解析逻辑太脆弱了。您可能应该完全避免
Replace
,而是显式地创建一个没有您检查过的字符的Substring
,并且您有一些奇怪的名称,例如test1
和test2
指的是不是最后一个字符的lastChar
- 这可能没问题,但更好的名字也有助于让事情在你的脑海中保持清晰。 - 您的代码注释不正确 (
decimal convTemp;//corrente resistenza
)。我通常避免所有纯技术代码注释;最好使用描述性变量名,这是另一种形式的自记录代码,但编译器至少可以检查您是否一致地使用它们。 - 而不是返回 4 个可能为空的值,您的
Stripper
应该接受一个参数“sink”对象,它可以在该对象上调用AddT
AddD
和AddA
直接。
我认为以上任何一项都不能解决您的问题,但我相信它们有助于让您的代码更简洁,并且(从长远来看)更容易找到问题。
关于c# - 多线程或其他不同的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17474543/