Может ли программа вызвать утечку памяти, установив и сбросив свойство backcolor?

Поскольку я не могу найти какой-либо элемент управления для использования в качестве светодиодного индикатора на моей winform для передачи и приема последовательной связи, я создал свой собственный пользовательский индикатор из label. Он в основном устанавливает и сбрасывает цвет метки с черного на салатовый для приема и с черного на красный для многократной передачи. Его класс следующий. Однако моя программа .NET, похоже, работает пару часов и полностью вылетает. Когда я просматриваю сведения об ошибке сбоя, Windows сообщает об этом как об ошибке clr20r3. У меня была аналогичная проблема, когда я писал и разрабатывал программу для 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: введите описание изображения здесь


person ThN    schedule 19.12.2012    source источник
comment
clr203r не означает color. Это Common Language Runtime, и быстрый поиск в Google на clr203r error обнаружил несколько совпадений, которые могут помочь.   -  person Ken White    schedule 19.12.2012
comment
Улучшите обработку ошибок. Напишите обработчик событий для AppDomain.CurrentDomain.UnhandledException и запишите или отобразите значение e.ExceptionObject.ToString (). Теперь вы знаете, почему и где происходит сбой.   -  person Hans Passant    schedule 19.12.2012
comment
И не используйте Systems.Timer.Timer, у него неприятное поведение потоковой передачи. Назначение свойства BackColor из его обработчика события Elapsed формально запрещено. Не избавляться от них смертельно, они продолжают работать, когда ваш пользовательский интерфейс исчезает. Нет смысла избегать System.Windows.Forms.Timer.   -  person Hans Passant    schedule 19.12.2012
comment
@HansPassant, была причина, по которой я использовал System.Timer.Timer, и это возвращает нас к этому вопросу о переполнении стека. stackoverflow.com/ questions / 13312164 /   -  person ThN    schedule 19.12.2012
comment
Вам хронически трудно помочь, вы игнорируете советы. Я, конечно, никогда не говорил об использовании System.Timers.Timer, - сказал я Use Control.Begin/Invoke()   -  person Hans Passant    schedule 19.12.2012
comment
@HansPassant и другие, я изменил свой класс TSerialIndicator и использовал System.Windows.form.Timer в winform, который будет закрыт после его использования для запуска моего приложения. Следовательно, таймер в winform не TICK. Я прав? Вот что я замечаю. Работает только один раз и не более того. Кстати, прошу прощения, если мне хронически трудно помочь. Я все еще учусь, поскольку я программирую. Кажется, в программировании .NET очень много дыр.   -  person ThN    schedule 20.12.2012
comment
Я полностью потерялся после комментария Ганса о ненадежности system.Timers.Timer. На данный момент я сделал все, что нужно сделать, но мой таймер вообще не срабатывает. Моя ситуация похожа на этот вопрос - stackoverflow.com/questions/725735/   -  person ThN    schedule 21.12.2012


Ответы (1)


Поскольку никто не хочет отвечать и я решил свою проблему, я отвечу на этот вопрос сам.

Да, это может привести к утечке памяти из того, что я испытал, и это зависит от того, как вы установите задний цвет для своего элемента управления. Если ваш элемент управления не помещен в winform, то установка и сброс заднего цвета за короткий промежуток времени может привести к утечке памяти, как сказал Ханс Пассант. Итак, я последовал его совету.

В основном я помещал свой элемент управления прямо в winform, а из моего потока я устанавливал и сбрасывал задний цвет. Пока это сработало. Я выполняю свою программу в течение последних 5 дней без перерыва, и она не сломалась и не потеряла контроль.

person ThN    schedule 02.01.2013