多线程或不同的东西

Fel*_*ceM 6 c# multithreading backgroundworker

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

我想知道在不同的线程上运行此函数是否可以解决问题以及如何做到这一点?或者,如果有不同的方法来解决问题.将赞赏示例代码.

更新,添加方法调用.

这就是我调用AddT方法的方法

if (b != "")
            {

                decimal convTemp; //corrente resistenza
                decimal.TryParse(b, out convTemp);
                AddT(convTemp);}
Run Code Online (Sandbox Code Playgroud)

就是我从序列中接收数据并将其传递给删除未经处理的字符并将值返回到不同变量的类的方法. 是删除unwonted字符并返回值的类.而是我如何管理串行输入数据.看到我的编码后请不要嘲笑我.我做了不同的工作,我自己学习.

Eam*_*nne 1

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

然而,如果重构代码,处理这些事情可能会更容易。您所展示的代码中有很多内容使得推理所发生的事情变得比必要的更加困难。

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

我不认为上述任何内容都能解决您的问题,但我确实相信它们有助于使您的代码更加干净,并且(从长远来看)使您更容易找到问题。