【问题标题】:C++ Having two "processes" run at the same time [closed]C ++同时运行两个“进程”[关闭]
【发布时间】:2015-01-19 19:12:53
【问题描述】:

在我正在构建的命令行应用程序中,我希望同时运行两个“进程”。所谓流程,我的意思是:

每 57 秒,我想做任务 A,每 250 秒做任务 B。这些是任意选择的数字,但你明白了。

如何同时检查这两个“进程”?

谢谢大家

【问题讨论】:

  • 是什么阻止你使用线程和睡眠?
  • 什么是线程?至于睡眠,如果我要进行 57000 次睡眠,然后再进行 250000 次睡眠,则将跳过 57 秒的任务。
  • 你使用的是什么操作系统
  • 顺便说一句,无论操作系统如何,您也可以使用 std::thread (C++11)
  • 为什么不设置cron 作业而不是增加代码的复杂性?

标签: c++


【解决方案1】:

如果这两个过程都不​​需要很长时间,你可以这样做。

float Atime = 57.f;
float Btime = 250.f;
float startTime = someTimerFunc();
while(true) {
    sleep(a few milliseconds);


    float endTime = someTimerFunc();
    float deltaTime = endTime - startTime;
    startTime = endTime;



    Atime -= deltaTime;
    Btime -= deltaTime;
    if(Atime < 0) {
        Atime += 57.f;
        AProcess();
    }
    if(Btime < 0) {
        Btime += 250.f;
        BProcess();
    }
}

或者你可以查看线程的作用。

【讨论】:

  • 有趣。非常感谢!我会试试这个。
  • @JoshBeckwith 我希望它有所帮助。它可能不起作用,我没有测试它,但你可以试试。
【解决方案2】:

运行 2 个线程将是处理此问题的好方法,除非您有理由需要 不同的进程。像这样的:

void taskA() { /*...*/ }
void taskB() { /*...*/ }

/*...*/

bool exit = false;
std::mutex mutex;
std::condition_variable cv;

auto runLoop = [&](auto duration, auto task)
    {
        std::unique_lock<std::mutex> lock{mutex};

        while(true)
        {
            if(!cv.wait_for(lock, duration, [&]{ return !exit; }))
                task();
            else
                return;
        }
    };

std::thread a{ [&]{ runLoop(std::chrono::seconds{57}, taskA); }};
std::thread b{ [&]{ runLoop(std::chrono::seconds{250}, taskB); }};

这样做是跨平台的标准 C++,这是一个主要的好处。它使用 C++11:lambdas 和线程库。

【讨论】:

【解决方案3】:

如上所述,您可以使用线程而不是进程。如果您使用的是 c++11,请查看here,了解如何创建线程。

在链接的示例中,只需将 foo 和 bar 替换为您希望任务 A 和任务 B 执行的代码即可。

您还可以查看here,了解如何让您的程序在睡眠状态下等待一段时间。

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多