为什么timer(system.windows.forms.timer)无法启动?

时间:2012-11-09 16:37:27

标签: .net winforms timer delphi-prism oxygene

在用户定义的类中,我有一个计时器,当我Timer.Enabled.

时它就不会启动

用户定义的类:

  TSerialIndicator = public class
  private
    method TxTimerEvent(Sender:System.Object; e:System.EventArgs);
  public    
    Txlight:Label;
    Txtimer:System.Windows.Forms.Timer;
    constructor(mform:Form);
    method Transmit;
    method Receive;
  end;

这是构造函数:

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

    TxLight.AutoSize := false;

    TxLight.BorderStyle := BorderStyle.FixedSingle;

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

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

    mform.Controls.Add(TxLight);

    TxTimer := new System.Windows.Forms.Timer;
    TxTimer.Interval:=1;

    TxTimer.Enabled:=false;
    TxTimer.Tick += new System.EventHandler(@TxTimerEvent);

    TxLight.BackColor := Color.Black;
end;

这是定义的传输方法:

method TSerialIndicator.Transmit;
begin
  TxLight.BackColor := Color.Red;

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

这是定义的TxTimerEvent:

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

以下是如何创建和使用它:

Slight := new TSerialIndicator(self);
Slight.Transmit;

当我从程序的其他部分调用Transmit时,它会发挥作用,但TxTimerEvent根本不会触发。我甚至尝试过启动/停止它的方法。它仍然没有执行其Tick事件。但是,我注意到当我从构造函数中启用计时器时,它会触发TxTimerEvent ONCE。

我做错了什么?

提前致谢,

1 个答案:

答案 0 :(得分:4)

使用“传输”和“接收”等方法名称,很可能涉及一个线程。就像运行SerialPort的DataReceived事件的线程池线程一样。或者由于System.Timers.Timer的Elapsed事件而运行的代码。等等。

在类似的工作线程中将System.Windows.Forms.Timer的Enabled属性设置为true不起作用,它不是线程安全的类。它执行通常的操作,创建一个隐藏窗口,使用Windows的SetTimer()方法来触发Tick事件。但是该窗口是在不抽取消息循环的线程上创建的。因此,Windows不会生成WM_TIMER消息。

根据需要使用Control.Begin / Invoke()以确保在UI线程上运行与计时器或控件相关的任何代码。