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何时到达那里。我正在使用-std=c++11启用了 MinGW 编译器的 Windows 运行,正如我之前提到的,我很想解决这个问题(并解释它是如何解决的),这样我就可以更好地掌握这个概念!

哦,如果有另一种(更好的)方法可以在没有线程的情况下执行此操作,也请随时分享您的知识!

4

2 回答 2

1

您可以使用 std::async 和std::future及其方法“wait_for”,超时时间为 0

于 2013-03-02T00:54:42.513 回答
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 回答