質問: 一定時間ごとにプログラムを起動させるプログラムを作りたい 「一定時間ごとにプログラムを起動させる」プログラムを、 作成したいと考えております。 #include #include void callback kidou() { char pass[255]; sprintf(pass,"./test1.exe"); shellexecute(null, null, pass, null, null, sw_shownormal); } void main() { settimer(null,1,1000,kidou); } この様な感じで作成しましたが、「test.exe」を起動できませんでした。 どのような修正をしたら良いのか教えていただけないでしょうか?
回答: 問題点が2点あります。 1. kidou関数がtimeproc型ではない。 settimerに渡すためにはkidou関数は、 void callback kidou(hwnd hwnd, uint nmsg, uint nidevent, dword dwtime) と宣言されいる必要があります。 このままではコンパイルもできないのではないでしょうか。 2. メッセージループが無い settimerはwm_timerメッセージをpostすることを指示するだけなので、 それを受け取る部分を用意しておかないとkidou関数は呼び出されません。 settimer呼び出し後にメッセージループを挿入する必要があります。 以上の問題を修正すると、次のようになります。 #include #include void callback kidou(hwnd hwnd, uint nmsg, uint nidevent, dword dwtime) { char pass[255]; sprintf(pass,"./test1.exe"); shellexecute(null, null, pass, null, null, sw_shownormal); } void main() { settimer(null,1,1000,kidou); msg msg; bool bret; while ((bret = getmessage(&msg, null, 0, 0)) != 0) { if (bret == -1) { break; }else { translatemessage(&msg); dispatchmessage(&msg); } } } 一応visual c++.net 2003で一定時間ごとにkidouが呼び出されることは確認しました。 最初に提示されたコードにsettimerが書いてありましたのでsettimerを使いましたが、 コンソールアプリケーションならば、settimer&メッセージループという大仰なものを 使うよりは、sleepで1秒待った方が楽だと思います。 sleepを使うと以下のようになります。 void kidou() { char pass[255]; sprintf(pass,"./test1.exe"); shellexecute(null, null, pass, null, null, sw_shownormal); } void main() { while (1) { sleep(1000); kidou(); } }