0

私はC++で何かを書いています。これには、0に達したときに値を設定するカウントダウン関数が含まれています。スレッド/ pthreads / Boostスレッドを数時間調査していて、何も機能しないようです。ですから、理想的には、自分のコードで何をする必要があるかについてのウォークスルーを探しています。私はC++にかなり慣れていませんが、言語に関係なく、並行性はこれまで調べたものを超えています。

バックグラウンドで実行したい関数は次のとおりです。

void Counter::decrementTime(int seconds){
    while(seconds != 0){
        seconds--;
        Sleep(1000);
    }
    bool = false;
}

これは、次のような単純な方法で呼び出されます(これは単なる例です)。

void Counter::setStatus(string status){
    if(status == "true"){
        bool = true;
        decrementTime(time); // Needs to run in background.
    } else if (status != "false"){
        bool = false;
    }
}

私はstd:thread myThread(decrementTime, time);他のさまざまな試み(すべてのヘッダーが適切に含まれているなど)と一緒になど、さまざまなことを試しました。

誰かがこれで私を助けることができれば私はそれをいただければ幸いです。実行中の関数などを監視する必要はありません。必要なのは、boolそこに到達したときに設定することだけです。有効にしたMinGWコンパイラを使用してWindowsを実行しています。-std=c++11前述したように、これを解決して(そしてどのように解決したかを説明して)、概念をもう少しよく理解できるようにしたいと思います。

ああ、スレッドなしでこれを行う別の(そしてより良い)方法がある場合は、あなたの知識も自由に共有してください!

4

2 に答える 2

1

std::atomic_boolasフラグを使用しstd::asyncて、別のスレッドで時刻を起動できます。

#include <atomic>
#include <chrono>
#include <future>

std::atomic_bool flag{true};

void countDown(int seconds){
  while(seconds > 0){
    seconds--;
    std::this_thread::sleep_for(std::chrono::miliseconds( ?? )); //
  }
  flag = false;
}

auto f = std::async(std::launch::async, std::bind(countDown, time));

// do your work here, checking on flag
while (!flag) { ... }

f.wait(); // join async thread
于 2013-03-02T07:24:42.720 に答える
1

std::async およびstd::futureとそのメソッド「wait_for」をタイムアウト 0 で使用できます

于 2013-03-02T00:54:42.513 に答える