負荷の少ないタイマー

解決


Fusa  URL  2007-12-29 14:17:53  No: 29116  IP: 192.*.*.*

時計などについてくる
ストップウォッチ機能や
キッチンタイマーというか

そういう種類のソフトを少し作ろうと思っています。

複数を起動して同時にカウントさせたいのですが
Timerコンポーネントだと負荷などが心配です。

できれば、1/100秒単位でカウントアップしても
なるべく負荷を減らして動作するような仕組みを
教えて欲しいです。

よろしくお願いします。

編集 削除
deldel  2007-12-29 14:22:41  No: 29117  IP: 192.*.*.*

昔、実験で10msのタイマーを数百個同時に
動作させましたが、結構問題なかったです。
環境にもよりますが、タイマーなら
それほど負荷を気にしなくてもいいと
思いますが・・・

編集 削除
KHE00221  2007-12-29 19:13:32  No: 29118  IP: 192.*.*.*

こんなの作ってみたけど?

http://khe00221.image.coocan.jp/index.php?FrontPage%2FComponent%2FTCollection%2FTimerList

編集 削除
Fusa  URL  2007-12-30 00:26:08  No: 29119  IP: 192.*.*.*

ありがとうございます。

そうですか、負荷はすくないんだ...
なんだか昔の印象で重かった気がしたんですが
試さずに気のせいで感じちゃよくなかったですね。

えっと、1タイマーを1プロセスで作ろうかと思っていたので
複数プロセス起動でしたいので
ちょっとKHE00221のものは目的と合致しないかもしれませんが
ありがとうございます。

いつも、素早い実装、お見事ですね。

編集 削除
Fusa  2007-12-30 00:30:19  No: 29120  IP: 192.*.*.*

また、解決チェックを忘れました。

あと、KHE00221さん、ですね。敬称略ってしまいすいません。

作れて動作検証したわけじゃないですが
解決としておきます。回答ありがとうございます。


そういえば、昔はスレッド動作するMMTimerとかが
いくつか結構紹介されていたのですが

どれを使えばいいのかよくわからなかったのと
スレッド周りにバグがあったみたいなので
いま使うのは躊躇していました。
TTimerでうまくいくか試してみます。

編集 削除
Fusa  URL  2007-12-30 01:45:08  No: 29121  IP: 192.*.*.*

連投になってしまいますが、昔CLXに付属してたstopwatchをみて作ってみました。

カウントアップ部分だけですがかなり簡単に実装できました。
deldelさん、KHE00221さん、改めてありがとう。

Timer1のIntervalは10にしておいてます。

…省略…
type
  TForm1 = class(TForm)
…省略…
  private
    FRunning: Boolean;
    procedure SetRunning(Value: Boolean);
  public
    StartTime: Extended;
    ElapsedTime: Extended;
    Reset: Boolean;
    property Running: Boolean read FRunning write SetRunning;
  end;

…省略…

procedure TForm1.SetRunning(Value: Boolean);
begin
  if FRunning <> Value then
  begin
    FRunning := Value;
    StartTime := ElapsedTime;
    if Value then
    begin
      Reset := False;
    end;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Reset then ElapsedTime := Now else ElapsedTime := Now - StartTime;
  if Running then
  begin
    Label1.Caption := FormatDateTime('nn:ss.zzz', ElapsedTime);
    Self.Caption := Label1.Caption;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Running := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Running := not Running;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if not Running then
  begin
    Label1.Caption := '00:00.000';
    Self.Caption := Label1.Caption;
    Reset := True;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button3Click(nil);
end;

編集 削除