負荷の少ないタイマー

解決


Fusa  URL  2007-12-29 23:17:53  No: 29116

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

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

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

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

よろしくお願いします。


deldel  2007-12-29 23:22:41  No: 29117

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


KHE00221  2007-12-30 04:13:32  No: 29118

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

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


Fusa  URL  2007-12-30 09:26:08  No: 29119

ありがとうございます。

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

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

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


Fusa  2007-12-30 09:30:19  No: 29120

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

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

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

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

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


Fusa  URL  2007-12-30 10:45:08  No: 29121

連投になってしまいますが、昔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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加