如何与程序的其余部分同时显示计时器?

How to display a timer simultaneously with the rest of the program?

所以我一直在做一个基于终端的测验作为我第一年的项目,我决定显示一个计时器和代码,但是计时器不让程序继续执行,因为使用了无限循环在定时器中。

我该如何解决这个问题?

    void timer()
{
    while (true) {
        clock_display();//Function loaded with manipulators to just show the 00:00:00 interface 
        sleep(1);
        sec++;
        if (sec == 60) {
            mins++;
            if (mins == 60) {
                hrs++;
                mins = 0;
            }
            sec = 0;
        }
    }
}

int main(){
     timer();
     //Other code I have to run
}

这个问题看起来更难。您希望同一个程序同时做两件事。虽然现在这种情况很常见,而且大多数课程 运行 都是这样,但这不是一年级学生期望的水平。

你需要的是并发编程,应该是个硬东西

下面是我能想到的最简单的问题解决方案示例。但是,并发 困难的:您需要参加一门特殊课程才能了解这里发生的事情和原因。

#include <iostream>
#include <thread>
#include <cmath>

void timer()
{
    int sec = 0;
    while (true)
    {
#pragma omp critical
        std::cout << sec++ << "\n";

        std::this_thread::sleep_for(std::chrono::duration<double>(1.0));
    }
}

void my_stuff()
{
    for (int i = 0; i < 100; i++)
    {
        double x = 0.0;
        for (int j = 0; j < 10'000'000; j++)
        {
            x += sin(i + j);
        }
#pragma omp critical
        std::cout << "x = " << x << "\n";
    }
}

int main()
{
#pragma omp parallel
#pragma omp sections
    {
#pragma omp section
        timer();
#pragma omp section
        my_stuff();
    }
}

将其编译为使用 OpenMP 的 C++ 程序:这是最简单的并发库。在 Linux 下:将 -fopenmp 添加到编译器标志,对于其他操作系统,互联网上充满了答案。

  • 我用#include<thread>只是为了能够运行sleep_for让程序休眠。这是一种可移植的方式,但您可以使用其他方法。通常,#include<thread> 是 C++ 的并发方式,但我相信这对您来说可能太难了。
  • 然后你就有了所有这些#pragma。这不是一个 OpenMP 教程的地方,你自己去找,有很多。
  • critical pragma 引入了一个临界区 来保护竞争线程共享的资源(此处:std::cout)。去找教程吧。
  • (两个)线程在 sections pragma 中自动生成,前提是程序已正确编译并且 运行 在至少具有 2 个内核(物理或虚拟)的处理器上。
  • 要成为 运行 的线程由 section pragma
  • 标识

就是这样。希望对你有用。

一见效,找个好的tutorial/textbook OpenMP and/or C++11 并发模型