時計などについてくる
ストップウォッチ機能や
キッチンタイマーというか
そういう種類のソフトを少し作ろうと思っています。
複数を起動して同時にカウントさせたいのですが
Timerコンポーネントだと負荷などが心配です。
できれば、1/100秒単位でカウントアップしても
なるべく負荷を減らして動作するような仕組みを
教えて欲しいです。
よろしくお願いします。
昔、実験で10msのタイマーを数百個同時に
動作させましたが、結構問題なかったです。
環境にもよりますが、タイマーなら
それほど負荷を気にしなくてもいいと
思いますが・・・
こんなの作ってみたけど?
http://khe00221.image.coocan.jp/index.php?FrontPage%2FComponent%2FTCollection%2FTimerList
ありがとうございます。
そうですか、負荷はすくないんだ...
なんだか昔の印象で重かった気がしたんですが
試さずに気のせいで感じちゃよくなかったですね。
えっと、1タイマーを1プロセスで作ろうかと思っていたので
複数プロセス起動でしたいので
ちょっとKHE00221のものは目的と合致しないかもしれませんが
ありがとうございます。
いつも、素早い実装、お見事ですね。
また、解決チェックを忘れました。
あと、KHE00221さん、ですね。敬称略ってしまいすいません。
作れて動作検証したわけじゃないですが
解決としておきます。回答ありがとうございます。
そういえば、昔はスレッド動作するMMTimerとかが
いくつか結構紹介されていたのですが
どれを使えばいいのかよくわからなかったのと
スレッド周りにバグがあったみたいなので
いま使うのは躊躇していました。
TTimerでうまくいくか試してみます。
連投になってしまいますが、昔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;
ツイート | ![]() |