6

这是我第一次遇到这样的问题。这不是我的职业,只是我的爱好,我没有以前的参考资料。在我的程序中,我一一添加了几个功能来控制机器。添加最后一个功能(温度测量)后,我开始在其他功能上遇到问题(其中大约 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);}

就是我从串行接收数据并将其传递给去除不常见字符并将值返回给不同变量的类的方式。 是去除不常见的字符并返回值的类。这就是我管理串行传入数据的方式。看到我的编码后请不要嘲笑我。我做不同的工作,我正在自学。

4

2 回答 2

1

您的问题在于解析您拥有的值

decimal.TryParse(a, out convRes);
AddA(convRes);

并且不要检查失败的值,如果它返回 true,则只接受该值

if(decimal.TryParse(a, out convRes))
{
   AddA(convRes);
}

您可能会遇到更多错误,但这会让您在每次 TryParse 失败时处理 0 个值。

于 2013-07-05T13:29:51.587 回答
1

很难判断是否有任何问题以及它可能是什么 - 它看起来像一个微妙的问题。

但是,如果您重构代码,可能更容易处理这些事情。您展示的代码中有很多东西使得推理正在发生的事情变得比必要更难。

  • 您正在使用floatdecimal-float不是那么准确,而是小而快;decimal(尝试)要精确,但尤其是可预测的,因为它以人类可能以 10 为底的方式舍入错误 - 但它非常慢,通常用于需要精确再现性的计算(例如金融资料)。您可能应该double在任何地方使用。
  • 你在课堂上有无用else {}的代码。Stripper
  • Stripper是一个无状态的类,当它应该只是一个具有静态方法的静态类时 -Stripper是无状态的。
  • 您捕获异常只是为了重新抛出它们。
  • 您正在使用TryParse,而不是检查成功。通常,如果您 (a) 期望解析有时会失败,并且(b) 可以处理该解析失败,则通常只会使用 TryParse。如果您不期望失败或无法处理它,那么您最好尽快了解崩溃而不是稍微不正确的值。
  • 在剥离器中,您正在复制变量,例如_currentMot, currentMotparam4但它们是相同的 - 仅使用参数,并给它一个逻辑名称。
  • 您正在使用out参数。定义一个简单的并返回它几乎总是一个更好的主意struct- 这也允许您确保您不能轻易混淆变量名称,并且封装和重用功能更容易,因为您不需要复制很长调用和参数定义。
  • 您的字符串解析逻辑太脆弱了。您可能应该Replace完全避免,而是在Substring没有您检查过的字符的情况下明确地创建 a,并且您有一些奇怪的名称,例如test1andtest2指的lastChar是不是最后一个字符的 - 这可能没问题,但更好的名称可以帮助保持事情也直接在你的脑海中。
  • 您有错误的代码注释 ( decimal convTemp; //corrente resistenza)。我通常避免所有纯粹的技术代码注释;最好使用描述性变量名称,这是另一种形式的自记录代码,但编译器至少可以检查您是否始终如一地使用它们。
  • 而不是返回 4 个可能为空的值,您Stripper可能应该接受它可以直接调用的参数“接收器”AddT AddD对象AddA

我认为以上任何一项都不能解决您的问题,但我相信它们有助于使您的代码更简洁,并且(从长远来看)更容易找到问题。

于 2013-07-05T22:53:17.507 回答