我想编写一些代码,它会在主线程上启动一些线程,该线程每2秒运行一次,并将在控制台上打印一些内容。

开始功能必须是这样的

     void StartTask(void* methodRoRun, long repeatTimeInSeconds);

这意味着该方法接收到指向将每隔repeatTimeInSeconds秒运行一次的函数(methodRoRun)的指针。

我找不到如何用C++做到这一点

最佳答案

像这样:

#include <thread>
#include <functional>

void f() {
    printf("Task started\n");
    // do stuff
}

void StartTask(std::function<void()> methodRoRun, long repeatTimeInSeconds) {
    std::thread th([methodRoRun, repeatTimeInSeconds]() {
        while (true ) {
            methodRoRun();
            std::this_thread::sleep_for(std::chrono::seconds(repeatTimeInSeconds));
        }
    });
    th.detach();
}

int main() {
    StartTask([](){ f(); }, 1);

    while (true) {}

    return 0;
}

编辑:

人们正确地指出了这一点,那就是分离线程并产生无限循环不是一个好习惯,但是该示例仅说明了这种方法。

09-20 01:49