如何与程序的其余部分同时显示计时器?
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 并发模型
所以我一直在做一个基于终端的测验作为我第一年的项目,我决定显示一个计时器和代码,但是计时器不让程序继续执行,因为使用了无限循环在定时器中。
我该如何解决这个问题?
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 并发模型