6

このような問題に直面したのはこれが初めてです。これは私の職業ではなく単なる趣味であり、これまでの参考文献はありません。私のプログラムでは、マシンを制御するためのいくつかの関数を 1 つずつ追加しました。最後の機能 (温度測定) を追加した後、他の機能で問題が発生し始めました (約 8 つの機能が同時に実行されています。発生している問題は、これとは関係のないグラフ (モーターの RPM) にあります)。温度測定を実行している場合と実行していない場合のこれら 2 つのチャートの違いがわかります. モーターの実際の速度は両方のチャートで同じですが、2 番目のチャートでは、アプリケーションが遅くなるため、その場でピースを失います下。

温度機能なし。 ここに画像の説明を入力 温度機能付き ここに画像の説明を入力

特に、この機能は上記の制御を妨げています。アプリケーションの作業負荷が重くなっているため、またはサンプリングが必要なため、それらを取得するのに時間がかかるためだと思います。

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

何か問題があるかどうか、またそれが何であるかを判断するのは非常に困難です。微妙な問題のように見えます。

ただし、コードをリファクタリングすると、これらのことを処理しやすくなる場合があります。あなたが示したコードには、何が起こっているのかを理解するのを必要以上に難しくしているものがたくさんあります。

  • あなたが使用しているfloatand decimal-float正確ではありませんが、小さくて高速です。decimal(試行) 正確にしようとしますが、人間が 10 進法で行うのと同じようにエラーを四捨五入するため、特に予測可能です。ただし、非常に遅く、通常、正確な再現性が必要な計算 (金融関連など) を対象としています。おそらくdoubleどこでも使用する必要があります。
  • クラスに役に立たないelse {}コードがあります。Stripper
  • あなたStripperは静的なクラスですが、静的メソッドを持つ静的クラスである必要があります-Stripperステートレスです。
  • 例外を再スローするためだけに例外をキャッチしています。
  • を使用してTryParseおり、成功を確認していません。通常、(a) 解析が時々失敗することが予想され、 (b) その解析の失敗に対処できる場合にのみ、TryParse を使用します。失敗を予期していないか、それに対処できない場合は、微妙に間違った値よりもすぐにわかるクラッシュの方が適切です。
  • ストリッパーでは_currentMot、 、currentMot、などの変数を複製param4していますが、それらは同一です。パラメーターのみを使用し、論理名を付けます。
  • パラメータを使用していoutます。ほとんどの場合、struct代わりに単純な戻り値を定義することをお勧めします。これにより、変数名を簡単に混同できないようにすることもできます。また、長いものを複製する必要がないため、機能をカプセル化して再利用するのがはるかに簡単になります。呼び出しと引数の定義。
  • あなたの文字列解析ロジックは脆弱すぎます。Replaceおそらく完全に避けるべきであり、代わりに、チェックした文字なしで a を明示的に作成する必要があります。最後の文字ではないa を参照するandのSubstringような奇妙な名前のものがあります-これは問題ないかもしれませんが、より良い名前が維持するのに役立ちます物事も頭の中でまっすぐに。test1test2lastChar
  • コード コメントが正しくありません ( decimal convTemp; //corrente resistenza)。通常、純粋に技術的なコード コメントはすべて避けます。説明的な変数名を使用することをお勧めします。これは、自己文書化コードの別の形式ですが、一貫して使用しているかどうかをコンパイラーが少なくともチェックできるものです。
  • 空の可能性のある 4 つの値を返すのではなく、直接Stripper呼び出すことができるパラメーター「シンク」オブジェクトを受け入れる必要があります。AddT AddDAddA

上記のいずれも問題を解決するとは思いませんが、コードを少しきれいに保ち、(長期的には) 問題を見つけやすくするのに役立つと思います。

于 2013-07-05T22:53:17.507 に答える
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 に答える