0

Delphiで2つのことを同時にしたい、例えばツータイマーを同時に実行したいのですが、、、、そのメソッドの使い方は?

たとえば、この簡単な例を見てみましょう。ここには 2 つのタイマーがあり、これらのタイマーは連続して実行されていますが、これらのタイマーを同時に実行したいのですが、どうすればよいでしょうか?

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

「タイマーを同時に実行したいのですが、どうすればいいですか?」

これは不可能です。

メイン スレッド内のすべてが 1 つのシーケンスで実行されます。タイマーを使用しても、2 つのプロシージャを同時に実行する方法はありません。

メイン スレッドのアイドル部分は、メッセージのメッセージ キューをチェックします。それらは1つずつ処理されます。これは、タイマー イベントが呼び出されたときに起こっていることです。タイマー イベントの実行中、メイン スレッドはこのイベントを実行するだけです。

そのため、タイマー イベント コードの複雑さに注意し、短くシンプルにしてください。

マルチタスクのパフォーマンスを向上させたい (またはタイマー イベントが複雑すぎる) 場合は、 を使用する必要がありますthreads。スレッドは、独自のスタックを使用してメイン スレッドと「並行して」実行されます。どのように並列が解釈されるかは、OS と CPU のコア数によって異なります。

のような適切な保護がなければ、スレッドから VCL 部分へのアクセスは不可能Synchronizeです。これは、同期部分がメインスレッドで実行されるまでスレッドが待機することを意味します。queueメインスレッドを実行するスレッドから非同期でメッセージを出すことも可能です。

マルチスレッドの例は、Delphi サンプル にありThrdDemoます。

于 2013-10-22T11:25:08.970 に答える
1

ハンドラーSleep内で呼び出さないでください。TTimer.OnTimer代わりに、yout タイマー間隔を 500 に設定すると、500 ミリ秒ごとに起動します。両方のタイマーが起動し、2 つのものが同時に実行されているような感覚が得られます。

ただし、両方のコードが同じスレッド (メイン スレッド) 内で実行されているため、これは幻想ですが、要件によっては、動作が許容される場合があります。

于 2013-10-22T10:06:48.587 に答える