多线程或不同的东西

时间:2013-07-04 16:08:07

标签: c# multithreading backgroundworker

这是我第一次遇到这样的问题。这不是我的职业,而只是我的爱好,我以前没有参考。 在我的程序中,我逐一添加了几个控制机器的功能。在我添加了最后一个功能(温度测量)后,我开始遇到其他功能的问题(大约有8个一起运行。我遇到的问题是在图表上(电机的RPM)与此无关你可以看到这两个图表在有和没有温度测量运行的情况下的差异。两个图表中电机的实际速度是相同的,但在第二个图表中,由于应用程序运行缓慢下来。

没有温度功能。 enter image description here 具有温度功能 enter image description here

特别是这个功能扰乱了上述控制,我认为这是因为应用程序的工作量变得很大,或者因为我需要采样所以有一段时间等待它们:

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是删除unwonted字符并返回值的类。 而this是我管理串行传入数据的方式。看到我的编码后请不要嘲笑我。我做了不同的工作,我自己学习。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

你可能有更多的错误,但是这个错误会让你每次TryParse失败时都会处理0个值。

答案 1 :(得分:1)

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

但是,如果重构代码,可能更容易处理这些事情。你所展示的代码中有很多东西使得理由发生的事情变得更加困难。

  • 您正在使用floatdecimal - float并不准确,但又小又快; decimal(尝试)是精确的,但特别是可预测的,因为它以人类可能在基数10的方式舍入错误 - 但它很慢,并且通常用于需要精确再现性的计算(例如财务资料) )。您应该在任何地方都使用double
  • else {}类中有无用的Stripper代码。
  • 你的Stripper是一个不可操作的类,当它应该只是一个静态方法的静态类时,Stripper是无状态的。
  • 你只是为了重新抛出异常来捕捉异常。
  • 您正在使用TryParse,而不是检查是否成功。通常,如果您(a)希望解析有时失败,(b)可以处理该解析失败,那么您只使用TryParse。如果你不指望失败或无法处理它,那么你最好快速了解崩溃,而不是一个巧妙的错误值。
  • 在脱衣舞中,您复制的变量包括_currentMotcurrentMotparam4,但它们是相同的 - 只使用参数,并为其指定逻辑名称。< / LI>
  • 您正在使用out个参数。定义一个简单的struct并返回它几乎总是一个更好的主意 - 这也可以让你确保你不能轻易混合变量名,并且它更容易封装和重用功能,因为你没有需要复制长调用和参数定义。
  • 您的字符串解析逻辑太脆弱了。你应该完全避免使用Replace,而是明确地制作一个没有你检查过的字符的Substring,并且你有一些奇怪的名字,比如test1test2引用一个不是最后一个字符的lastChar - 这可能没问题,但更好的名字也可以帮助你把事情记在心里。
  • 您的代码注释不正确(decimal convTemp; //corrente resistenza)。我通常会避免所有纯粹的技术代码注释;最好使用描述性变量名称,这是另一种形式的自我记录代码,但编译器至少可以检查是否一致地使用它们。
  • 相反,返回4可能为空的值,您的Stripper应该接受参数“sink”对象,可以在其上直接调用AddT AddDAddA。< / LI>

我认为以上任何一项都无法解决您的问题,但我相信它们可以帮助您保持代码更清洁,并且(从长远来看)可以更轻松地找到问题。