0

我想在delphi中同时做两件事情,比如要同时运行两个定时器,,,,怎么用那个方法呢?

例如,让我们看这个简单的例子,这里有两个定时器,这些定时器连续运行,但我想同时运行定时器,,但是如何?

procedure TForm1.Button1Click(Sender: TObject);

begin

if Button1.Caption = 'START' then
  begin
  Timer1.Enabled := True;
  Timer2.Enabled := True;
  Button1.Caption := 'FINISH'
  end
else if Button1.Caption = 'FINISH' then
  begin
  Timer1.Enabled := False;
  Timer2.Enabled := False;
  Button1.Caption := 'START';
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i : integer;
begin
for i := 0 to 50 do
  begin
  Memo1.Lines.Add(IntToStr(i));
  sleep(500);
  end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
var
k : integer;
begin
for k := 0 to 50 do
  begin
  Memo2.Lines.Add(IntToStr(k));
  sleep(500);
  end;
end;

end.
4

2 回答 2

3

“我想同时运行计时器,但是如何?”

这是不可能的。

主线程中的所有内容都按顺序运行。即使使用计时器,也无法同时运行两个程序。

主线程的空闲部分检查消息队列中的消息。它们被一一处理。这就是调用计时器事件时发生的情况。在执行计时器事件期间,主线程只执行此事件。

所以要小心你的定时器事件代码的复杂性,并保持简短。

如果你想要更好的多任务处理性能(或者你的定时器事件太复杂),你必须使用threads. 线程使用自己的堆栈与主线程“并行”执行。并行的解释方式取决于操作系统以及 CPU 的核心数。

如果没有适当的保护,就不可能从您的线程访问 VCL 部分,例如Synchronize. 这意味着线程会一直等待,直到同步部分在主线程中执行完毕。也可以queue从要执行的主线程线程异步消息。

您可以在 Delphi 示例中找到多线程示例,ThrdDemo.

于 2013-10-22T11:25:08.970 回答
1

不要Sleep在处理程序内部调用TTimer.OnTimer。相反,将你的计时器间隔设置为 500,它将每 500 毫秒触发一次。两个计时器都会触发,您会感觉到两件事同时运行。

然而,这是一种错觉,因为两个代码都在同一个线程(主线程)中运行,但根据您的要求,这种行为可能是可以接受的。

于 2013-10-22T10:06:48.587 回答