前提・実現したいこと
c++の標準ライブラリであるstd::threadでメインスレッドとは別のスレッドでタイマーを動かしたいと考えています。しかし、std::threadのjoin()により呼び出したスレッドが終了するまで呼び出し元のスレッドが待機してしまうため、上手くタイマーを作れないです。この問題を回避する方法ないでしょうか?
該当のソースコード
c++
1#include <chrono> 2#include <thread> 3#include <iostream> 4using namespace std::chrono; 5 6void timer() { 7 while (1) { 8 auto time1 = high_resolution_clock::now(); 9 std::this_thread::sleep_for(milliseconds(1000)); 10 auto time2 = high_resolution_clock::now(); 11 12 auto ms = duration_cast<milliseconds>(time2 - time1); 13 std::cout << ms.count() << std::endl; 14 } 15} 16 17int main() { 18 std::thread th(timer); 19 th.join(); 20 while (1) { 21 //メイン処理 22 } 23 return 0; 24}
このメイン処理前のth.join()で待機してしまいます。
何がしたいのでしょうか? 実現しようとしているタイマーの機能が不明です。
timer関数の中は無限ループになっているので、「 std::cout << ms.count() << std::endl;」で約1秒おきに画面出力が出るのでしょう。それで、何が不満なのですか?
timer関数は無限ループを実行するので終了することがありません。そんな関数を実行しているthreadをjoinしようとしたら永遠に待つしかないですよね。
どのような動きをするプログラムが作りたいのかを具体的に質問に付け加えると、回答が得られるのではないでしょうか?
簡単な例でいうと、メインのwhileループ内で一定時間ごとに処理を行うようなプログラムを組みたいのですが、sleep()を使っている間は他の処理もできなくなるためスレッドを使用して実現できないかと考えていました。
メインのwhileループ内で、定期的に(sleepを使って間を開けて)別スレッドで処理をさせれば良いのではないでしょうか? メインでsleepしている間も別スレッドの実行は進みますからね。
はい。ありがとうございます。クロック同期っていうのを使うことにしました。何も知らないゴミがここに質問書いてしまい迷惑かけて申し訳ありませんでした。
一定時間が1s、処理が100msだとすると余った900msの間なにするんですか? なにもすることないならsleep_untilしてりゃいいんじゃないかと。
回答1件
あなたの回答
tips
プレビュー