はじめまして、トールと申します。
ある時刻になったら何かするってのはどう実装すればよいでしょうか?
一定時間経ったら何かするってのは、SetTimer()を使えば良いみたいですが、
私のやりたいのは、定期的にある処理をしていて、ある時刻(例:5時10分)に
なったら別の処理を行うというものです。
内部的に目覚ましみたいなものを作成したいのですが、どのように
作れば良いでしょうか?
よろしくお願いします
一定時間ごとにGetLocalTimeとかを使って時間を取得すればいいんじゃないですか。
はじめまして。
TimerID = SetTimer(hWnd, ID_TIMER, 1000, (TIMERPROC)TimerProc);
void CALLBACK TimerProc(HWND hWnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
SYSTEMTIME st;
int hour,min;
GetLocalTime(&st);
hour = st.wHour;
min = st.wMinute;
if ((hour == 5) && (min == 10)){
//何らかの処理
}
return ;
}
というのはどうですか?(試したわけではないですけど・・・)。
タイマーの精度をもうちょっと落としても良いんじゃないですか?
だいたい60000ms(←たぶん1分)くらいで。
こんにちわ、トールです。
toruさん、Mr.Tameさん、回答ありがとうございます。
現在の時刻から特定の時刻まで何秒待てば良いのか調べます。
その時間をSetTimerに渡して、その時刻になったらコールバックルーチン
が呼ばれるといった実装にしようかと思います。
アドバイスありがとうございました。
サンプルを作って試してみます。
もし、60000msにタイマーを設定すると
パソコンに電源を入れ続け長期間使用して
いたら誤差がでてくるかもしれませんね。
その必要がないのなら、60000msでも
いいとおもいますけど・・・・。
というかパソコンの時計なんて放っておいたら10分くらい平気でずれますし。
60秒間隔でチェックしてると誤差がなくてもタイミング次第で最悪59秒は遅れちゃいます
ね。
Mr.Tameさんが書いたコード
> if ((hour == 5) && (min == 10)){
の部分を
if (sec >= 30) { min ++; }
if (hour == 5 && min >= 10 && min <= 11) {
と書きかえれば、29秒以内に抑えられます。
というか根本的にタイマを60000msに設定した場合
> if ((hour == 5) && (min == 10)){
これじゃダメですね。
訂正
> if (hour == 5 && min >= 10 && min <= 11) {
↓
if (hour == 5 && min >= 10 && min <= 12) {
なるほど四捨五入するわけですね。
分単位で設定するアプリならそれで十分かもしれませんね。
結局トールさんの解決策が一番よさそうですが。
解決済みなのに話を蒸し返して申し訳なかったです。