|
分類:[C/C++]
はじめまして。
VisualStudio2017 VC++環境で、 ユーザクラス(CWinではない)内で非同期のタイマー処理を実装したいと思っています。 当初、内部的にヘルパーウインドウを用意して、「SetTimer」を利用しようと思っておりましたが、 そのためのメッセージループを用意することができず、断念しました。 ※メッセージループを実行すると、クラスの呼出し元にステップが返らなくなるので。
そこで、「std::thread」や「std::async」によって、別スレッド実行しそこで指定の時間スリープ後に 必要な処理を実施するようにしようと考えました。 しかし、上記のどちらも、最終的にthread.join()やfuture.getで非同期処理の終了を待つ必要があるとの情報をネットで見ました。 ※タイマー起動後は、即座に呼出し元に制御を戻し、タスク終了まで待ちたくありません。
上記条件から、std::asyncで以下のような方法を考えましたが、何か問題ありそうか、またもっと良い方法があるか 相談させていただけたらと思い、投稿させていただきました。
[方針] 1.クラスのメンバ変数にstd::futureを保持するstd::vectorを用意する。
2.非同期実行時に「std::launch::async」ポリシーで実行し、戻り値(Future)をリストに追加する。 ※futureのデストラクタでget()が動作し、タスクの終了まで待ちが発生するようになる。 リストから対象をerase()することで、デストラクタが動作する。
3.非同期関数の終了直前で、リストから該当フィーチャーを削除する。
4.非同期関数は、既定時間のスリープではなく、1秒ずつの秒数回のループにし、 強制終了フラグがONの場合、ループを抜ける処理を入れる。 クラスのデストラクタで、フラグを立て、アプリ終了時にアプリがなかなか終了しないといった状況を避ける。
よろしくお願いいたします。
|