Поскольку я не могу найти какой-либо элемент управления для использования в качестве светодиодного индикатора на моей 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:
clr203r
не означаетcolor
. ЭтоCommon Language Runtime
, и быстрый поиск в Google наclr203r error
обнаружил несколько совпадений, которые могут помочь. - person Ken White   schedule 19.12.2012Use Control.Begin/Invoke()
- person Hans Passant   schedule 19.12.2012TICK
. Я прав? Вот что я замечаю. Работает только один раз и не более того. Кстати, прошу прощения, если мне хронически трудно помочь. Я все еще учусь, поскольку я программирую. Кажется, в программировании .NET очень много дыр. - person ThN   schedule 20.12.2012