2

WinForm でシリアル通信の送受信用の LED インジケーターとして使用するコントロールが見つからないため、ラベルから独自のユーザー定義インジケーターを作成しました。基本的には、ラベルの色を、受信用に黒からライムに、送信用に黒から赤に設定および再設定を繰り返します。そのクラスは次のとおりです。しかし、私の .NET プログラムは数時間実行され、完全にクラッシュしたようです。クラッシュ エラーの詳細を表示すると、Windows はそれをclr20r3 errorとして報告します。Fedora Linux でプログラムを作成および開発したときに、同様の問題が発生しました。フォーム上の私のシリアル通信インジケータは、どういうわけかメモリ リークを引き起こし、プログラムをクラッシュさせました。それを削除すると、問題なく動作しました。

では、ラベルの背景色の設定とリセットを数秒以内に繰り返すことでメモリ リークが発生する可能性はありますか?

namespace SerialLED;

interface

uses
  System.Collections.Generic,
  System.Windows.Forms,
  System.Drawing.*,
  System.Text;

type

  TheLED = public class(Label)
  private
  protected
  public
    constructor;
  end;

  TSerialIndicator = public class
  private
    method TxTimerEvent(Sender:System.Object; e:System.EventArgs);
    method RxTimerEvent(Sender:System.Object; e:System.EventArgs);
  public
    Txlight:TheLED;
    Rxlight:TheLED;
    TxTimer:System.Timers.Timer;
    RxTimer:System.Timers.Timer;
    constructor(mform:Form);
    method Transmit;
    method Receive;
  end;

implementation

method TSerialIndicator.Transmit;
begin
  TxLight.BackColor := Color.Red;
  if TxTimer.Enabled = false then
     TxTimer.Enabled:=true;
end;

method TSerialIndicator.Receive;
begin
  RxLight.BackColor := Color.Lime;

  if RxTimer.Enabled=false then
    RxTimer.Enabled:=true;
end;

method TSerialIndicator.RxTimerEvent(Sender:System.Object; e:System.EventArgs);
begin
    RxLight.BackColor := Color.Black;
    RxTimer.Enabled:=false;
end;

method TSerialIndicator.TxTimerEvent(Sender:System.Object; e:System.EventArgs);
begin
    TxLight.BackColor := Color.Black;
    TxTimer.Enabled:=false;
end;

constructor TSerialIndicator(mform:Form);
begin
    RxLight := new TheLED;
    TxLight := new TheLED;

    TxLight.AutoSize := false;
    RxLight.AutoSize := false;

    TxLight.BorderStyle := BorderStyle.Fixed3D;
    RxLight.BorderStyle := BorderStyle.Fixed3D;

    TxLight.Location := new point(52,163);
    RxLight.Location := new point(82,163);

    TxLight.Width := 20;
    TxLight.Height := 20;
    RxLight.Width :=20;
    RxLight.Height := 20;

    mform.Controls.Add(RxLight);
    mform.Controls.Add(TxLight);

    RxTimer := new System.Timers.Timer;
    TxTimer := new System.Timers.Timer;
    RxTimer.Interval:=50;
    TxTimer.Interval:=50;
    RxTimer.Enabled:=false;
    TxTimer.Enabled:=false;
    RxTimer.Elapsed += new System.Timers.ElapsedEventHandler(@RxTimerEvent);
    TxTimer.Elapsed += new System.Timers.ElapsedEventHandler(@TxTimerEvent);

    RxLight.BackColor := Color.Black;
    TxLight.BackColor := Color.Black;
end;

constructor TheLED;
begin
  self.DoubleBuffered:=true;
end;

これは、winform でどのように見えるかです: ここに画像の説明を入力

4

1 に答える 1

0

誰も答えたがらず、問題は解決したので、この質問に自分で答えます。

はい、私が経験したことからメモリリークが発生する可能性があり、コントロールの背景色をどのように設定するかによって異なります。コントロールが winform に配置されていない場合、Hans Passant が言ったように、バックカラーを短時間で設定およびリセットすると、メモリ リークが発生する可能性があります。それで、私は彼のアドバイスに従いました。

基本的に、コントロールを winform に配置し、スレッドから背景色を設定およびリセットしました。これまでのところ、それは機能しています。私は過去 5 日間ノンストップでプログラムを実行しており、クラッシュしたり制御を失ったりしていません。

于 2013-01-02T14:06:50.623 に答える