6

Form1 との間で複数のパラメーターを受け取って返すクラスにメソッドがあります。これらのパラメーターを使用してコードを実行するには、時限イベントを使用する必要があります。ダイナミクスを示すために、この単純化されたコードを整理しました。

class Motor
{
    public static System.Timers.Timer _timer;
    int valReg = 30;

    public void PID(decimal _actualSpeed, Decimal _speedRequest, out Decimal _pwmAuto, out decimal _preValReg)
    {

        _timer = new System.Timers.Timer();
        _timer.Interval = (3000);
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timerAutoset);
        _timer.Enabled = true;
        // {....}
        _pwmAuto = valReg;
        _preValReg = valReg - 1;
    }
    static void _timerAutoset(object sender, System.Timers.ElapsedEventArgs e)
    {
        /* here I need to work with:
         _actualSpeed
         _speedRequest
         _pwmAuto
         _preValReg
        and send back the last two variables
         */
    }    
}

これは、Form1 ボタンから変数を渡したり受け取ったりする方法です。

        private void button4_Click(object sender, EventArgs e)
        {
        // some code ................
        Motor mtr = new Motor();
        mtr.PID(speedRequest, actualSpeed, out pwmAuto, out xxx);
        //..more code

これらのパラメータを _t​​imerAutoset イベントとの間で受け渡しするにはどうすればよいですか?

4

7 に答える 7

13

私は、匿名デリゲートを使用してこの問題を解決する傾向があります。

public void PID(decimal _actualSpeed, Decimal _speedRequest, out Decimal _pwmAuto, out decimal _preValReg)
{
    _pwmAuto = valReg;
    _preValReg = valReg - 1;

     // Because we cannot use [out] variables inside the anonymous degegates,
     // we make a value copy
     Decimal pwmAutoLocal = _pwmAuto;
     Decimal preValRegLocal = _preValReg;

    _timer = new System.Timers.Timer();
    _timer.Interval = (3000);
    _timer.Elapsed += (sender, e) => { HandleTimerElapsed(_actualSpeed, _speedRequst, pwmAutoLocal, preValRegLocal); };        
    _timer.Enabled = true;
    // {....}

}

static void HandleTimerElapsed(Decimal actualSpeed, Decimal speedRequst, Decimal pwmAuto, Decimal preValReg)
{
   // (...)
}

(デリゲートが外側のブロックからローカル変数にアクセスする場合は注意が必要です。コードを再確認して、これらの変数に格納されている値が、イベント ハンドラーの割り当てとこのハンドラーの呼び出しの間で変更されないことを確認してください)。

于 2013-06-03T06:30:05.683 に答える
2

これらのパラメータは別の場所から来ているようです。callback1 つのアプローチは、ビアを渡し、delegateそれを使用して更新された値を取得することです。

別のアプローチは、 を作成してのコンストラクターclassに渡し、 でMotorその参照を使用し_timerAutosetて更新された値を取得することです。

デリゲートの使用:

class Motor
{
    public static System.Timers.Timer _timer;
    int valReg = 30;
    public delegate TimerParam ParameterizedTimerDelegate();
    public static ParameterizedTimerDelegate TimerCallback { get; set; }

    public void PID()
    {
        _timer = new System.Timers.Timer();
        _timer.Interval = (3000);
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timerAutoset);
        _timer.Enabled = true;
        // {....}
        //Param.PwmAuto = valReg;
        //Param.PreValReg = valReg - 1;
    }
    static void _timerAutoset(object sender, System.Timers.ElapsedEventArgs e)
    {
        TimerParam param = TimerCallback();
        /* here you can use:
         Param.ActualSpeed
         Param.SpeedRequest
         Param.PwmAuto
         Param.PreValReg
        */
    }
}

共有インスタンスの使用:

class TimerParam
{
    public decimal ActualSpeed { get; set; }
    public decimal SpeedRequest { get; set; }
    public Decimal PwmAuto { get; set; }
    public decimal PreValReg { get; set; }
}

class Motor
{
    public static System.Timers.Timer _timer;
    int valReg = 30;
    public TimerParam Param { get; set; }

    public void PID(TimerParam param)
    {
        Param = param;

        _timer = new System.Timers.Timer();
        _timer.Interval = (3000);
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timerAutoset);
        _timer.Enabled = true;
        // {....}
        Param.PwmAuto = valReg;
        Param.PreValReg = valReg - 1;
    }
    static void _timerAutoset(object sender, System.Timers.ElapsedEventArgs e)
    {
        /* here you can use:
         Param.ActualSpeed
         Param.SpeedRequest
         Param.PwmAuto
         Param.PreValReg
        */
    }
}

TimerParam次に、クラスに渡したインスタンスを更新するMotorと、タイマーは常に更新された値を取得します。

于 2013-06-03T06:18:50.847 に答える
1

追加の引数を挿入するためにラムダ式を使用してみることができます..

  _timer.Elapsed += (sender, e) => _timerAutoset(sender, e, _actualSpeed,_speedRequest);

あなたの方法は次のようになります

static void _timerAutoset(object sender, System.Timers.ElapsedEventArgs e,decimal speed,decimal speedRequest)
于 2013-06-03T06:31:58.470 に答える