質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

92.04%

  • C++

    1684questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

c++で一定間隔で関数を実行させたい

受付中

回答 3

投稿 2016/02/16 17:26

  • 評価
  • クリップ 0
  • VIEW 6,479

TaruOrder

score 38

一定時間ごとにある関数を実行させるというプログラムを書こうと思いsettimerというものにたどり着きました。
いろいろなサイトを見たのですが使い方がよくわからずです
お願い致します...

  • 気になる質問をクリップする

    クリップした質問に回答があった場合に通知・メールを受け取ることができます。

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

どれくらいの初心者レベルなのかわからないので、取り敢えず下記を参考にしてみてください。

ここ

↑ここのサンプルはC言語ですが、C++もタイマー処理は基本同じです。
SetTimerでタイマー処理を登録すると、そのアプリにWM_TIMERのメッセージが設定した周期で送られてきます。それをメッセージループで捉えて処理することになります。(周期はきっちりではなくほぼその周期になります。PCのタイマーは精度がそれほど良くないので)

投稿 2016/02/16 17:43

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

0

VC++の場合の使い方です。
下記が参考ソースになります。

CXxxxx::MainFunc()//タイマーをセットする関数
    {
    ・・・・・・・・略・・・・・・・・
    SetTimer(1, 100, NULL);    // タイマを設定する
                                // 引数の意味(タイマーID、呼び出す間隔(ms), NULLでOK)
    ・・・・・・・・略・・・・・・・・・
}

// タイマーが呼ばれた時の処理を記述する
void CXxxxx::OnTimer(UINT nIDEvent) 
{
    if (nIDEvent ==1) { // 1番目のタイマーの時
        //ここに実行したい処理を記述して下さい
    }

    CXxxxx::OnTimer(nIDEvent);
}

CXxxxx::StopTimer()//必要なくなったらタイマーを止める!!!
{
    KillTimer(1);    // 1番目のタイマーを止める
}

こんな感じでしょうか。

投稿 2016/02/16 17:59

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/02/16 18:30

    イベントIDがこちらで指定した1になるとは限りません。SetTimerの戻り値が実際に採用されたイベントIDですのでこれを保存しておき、OnTimerハンドラでの判定にもKillTimer呼び出しにも使うようにする必要があります。

    またタイマーを止めるのが「必要なくなったら」は正しいのですが、実際のアプリで「必要なくなった」と言えるのはいつかという問題、うっかりデストラクタとかでKillTimerやるように書くとタイミング遅すぎるので、WM_DESTORYのタイミングでやる必要があるという点もキモです。

    キャンセル

  • 2016/02/16 19:59

    確かイベントIDは自分が設定すると思いましたが・・・少なくとも私が過去実装した(と言っても数年前ですが・・・)時はそうでしたが。

    キャンセル

  • 2016/02/16 21:19

    関数呼び出しの際には自分で設定値を渡しますが、もしすでにそのIDが使用されていた場合などは設定値と違うIDが返ってきます。なので行儀のいい書き方という点では戻り値を正式なIDとして使う方が良いと思います。

    キャンセル

0

SetTimerはWindowsのメッセージループを利用する場合のみ利用できます。もし、Windowsのコンソールや、他の環境でタイマー機能を実現したい場合は、標準C++ではスレッドを利用することが考えられます。

#include <atomic>
#include <thread>
#include <chrono>

auto alive = std::atomic_bool(true);
auto th1 = std::thread( [&alive]{
    const std::chrono::milliseconds interval(1000);
    while( alive.load() ){
        auto start = std::chrono::system_clock::now();
        call();
        auto end = std::chrono::system_clock::now();
        auto waste = end - start;
        if( waste < interval ){
            std::this_thread::sleep_for( interval - waste );
        }
    }
} );
th1.detach();

alive.store(false); // stop calling

投稿 2016/02/16 19:28

編集 2016/03/02 23:41

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

92.04%

同じタグがついた質問を見る

  • C++

    1684questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

閲覧数の多いC++の質問