タイマーコントロールについて

[戻る]
test 2007/07/30(月) 15:39:34
VisualStudio2005でタイマーコントロールを使用したアプリを作成しています。タイマ
ーのIntervalを60000で設定し1分毎に処理させているのですがこのタイマー間隔を現在
時刻と誤差なく連動させたいのですが実現できますでしょうか?

例えば、現在時刻が15時33分24秒だとしてタイマーを1分間隔でセットし、時刻が34分
ジャスト(秒が00秒)になったらタイマー処理が走るようなことがしたいです。

タイマーコントロールだけでは実現出来ないでしょうか?タイマーのAPI等が必要になっ
てきますでしょうか?

Blue 2007/07/30(月) 15:51:32
>VisualStudio2005でタイマーコントロール
プロジェクトの種類はなんでしょうか?

CLR Windows フォームアプリケーションでしょうか?

test 2007/07/30(月) 16:00:27
Blueさん

>>CLR Windows フォームアプリケーションでしょうか?

はい、そうです。

tmrNowTime->Interval = 60000;  
tmrNowTime->Enabled = true;

としています。

タイマー起動後の経過時間を取得する方法はAPIでしょうか?

経過時間と現在時間の秒を比較して(そもそも比較出来るのかが?ですが)00じゃなかった
ら00になるまで処理をしない(Enabled = false)という方法を考えましたがこの考え方は
正しいでしょうか?もっと誤差が出ないような方法があればご教授お願いします。

Blue 2007/07/30(月) 16:03:41
C++だけをターゲットとしないで、C#やVB.NETも同じFrameworkを使っているので
あわせて検索してみるとよいでしょう。

処理時間を正確に計測するには?[2.0のみ、C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/412stopwatch/stopwatch.html

たいちう 2007/07/30(月) 16:11:17
許容できる誤差はどの位でしょうか?

0.1秒や0.2秒位までの精度ならば、現在時刻と15時34分00秒までの
差の分でタイマーをセットすれば多分十分でしょう。

一分毎の処理が終わったら、処理終了後にまた現在時刻を取得して、
次の処理の時刻までの値でセット。

また、Windowsを操作していて、1秒や2秒(あるいはもっと)反応が
無い時がありますが、このような経験をお持ちですよね?
このような時には、あなたのプログラムもジャストの処理から
遅れる場合がありますが、これが許容できるのならば
上記の方法で十分です。

test 2007/07/30(月) 16:55:13
Blueさん たいちうさん

迅速なアドバイスありがとうございます。今回は0.1秒や0.2秒位までは誤差の許容範囲
ですのでタイマー経過値と現在時刻の差を求めてタイマーにセットしようと思います。

Blueさんの紹介してくださったストップウオッチクラスも今後役に立ちそうです。

タイマーコントロールですが経過時間を取得する方法を調べたのですがAPIだと
timeGetTimeが使用出来そうです。もしくはBlueさんが紹介してくださったクラスを使用
するかのどちらかです。

タイマーコントロール自体には経過時間を取得できるものはないみたいですね(><)

test 2007/07/30(月) 17:36:29
Blueさん

たびたびすみません。

テスト的にストップウオッチクラスを使用してみようと思ったのですが

using namespace System::Diagnostics;

とし

Stopwatch sw = gcnew Stopwatch();

でリビルドした所

error C3673: 'System::Diagnostics::Stopwatch' : クラスはコピー コンストラクタを
含んでいません

上記のエラーが表示されました。CLRで使用する場合、上記の方法以外の記述をしなけれ
ばならないのでしょうか?

Blue 2007/07/30(月) 17:45:17
>Stopwatch sw = gcnew Stopwatch();
Stopwatch sw^ = gcnew Stopwatch();

gcnewして代入するときの左辺はハットがついた型になります。

Blue 2007/07/30(月) 17:45:46
間違えました。 orz

>Stopwatch sw^ = gcnew Stopwatch();
Stopwatch^ sw = gcnew Stopwatch();

test 2007/07/30(月) 18:01:27
Blueさん

親切にありがとうございます。"^"まだCLIに慣れなくて忘れがちになってしまうんです
よね(汗)gcnewもnewと書いてしまうことも多々あります。

せっかくなのでStopWatchクラスを使用して経過時間を取得してみようと思います。

test 2007/07/31(火) 10:28:23
[[解決]]
みなさまのアドバイスを元に意図した動作のアプリが実装できました。
ありがとうございました。

古いスレッドには追加発言できません。