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 回答