2

这一定是一个经常被问到的问题,但我找不到我要找的东西。

想象一下:

  • 一个程序启动“你好,你叫什么名字?”
  • 你输入一个数字,它会显示“你的名字不能是数字!”

您不断输入一个数字并不断收到该错误,而在后台它只是通过每秒执行 n++ 来跟踪程序运行了多长时间,无论文本/输入部分发生什么。最终你可以输入“时间”之类的东西,然后它会显示你在那里呆了多长时间,以秒为单位......

所以我的问题是:你到底要怎么做呢?让他们独立运行?

提前致谢!

编辑:我不是特别想做这个计时的事情,这只是我能想出的最简单的例子来询问独立运行的功能..

4

4 回答 4

9

您无需运行并行任务即可测量经过的时间。C++11 中的一个例子:

#include <chrono>
#include <string>
#include <iostream>

int main()
{
    auto t1 = std::chrono::system_clock::now();

    std::string s;
    std::cin >> s;
    // Or whatever you want to do...

    auto t2 = std::chrono::system_clock::now();
    auto elapsedMS =
        (std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1)).count()

    std::cout << elapsedMS;
}

编辑:

由于您似乎对并行启动多个任务的方式感兴趣,这里有一个提示(同样,使用 C++11):

#include <ctime>
#include <future>
#include <thread>
#include <iostream>

int long_computation(int x, int y)
{
    std::this_thread::sleep_for(std::chrono::seconds(5));

    return (x + y);
}

int main()
{
    auto f = std::async(std::launch::async, long_computation, 42, 1729);

    // Do things in the meanwhile...
    std::string s;
    std::cin >> s;
    // And we could continue...

    std::cout << f.get(); // Here we join with the asynchronous operation
}

上面的示例启动了一个至少需要 5 秒的长时间计算,同时执行其他操作。然后,最终,它调用get()未来对象加入异步计算并检索其结果(如果尚未完成,则等待它完成)。

于 2013-05-12T13:49:26.413 回答
2

如果您真的想使用线程,而不仅仅是计算时间,您可以使用boost

例子:

include <boost/thread.hpp>

void task1() { 
    // do something
}

void task2() { 
    // do something
}

void main () {
    using namespace boost; 
    thread thread1 = thread(task1);
    thread thread2 = thread(task2);
    thread2.join();
    thread1.join();
}
于 2013-05-12T14:03:39.693 回答
1

我并不是特别想做这个计时的事情,这只是我能想出的最简单的例子来询问独立运行的功能..

然后你可能想研究多线程。在 C++11 中,您可以这样做:

#include <thread>
#include <iostream>

void func1() {
    std::cout << "func1" << std::endl;
}

void func2() {
    std::cout << "func2" << std::endl;
}

int main() {
    std::thread td1(func1);
    std::thread td2(func2);
    std::cout << "Started 2 threads. Waiting for them to finish..." << std::endl;
    td1.join();
    td2.join();
    std::cout << "Threads finished." << std::endl;
    return 0;
}

如果您不使用 C++11,您仍然可以选择。您可以查看:

于 2013-05-12T13:59:32.137 回答
0

首先,您不需要增加自己的时间变量。只需记录程序启动的时间,time命令将返回现在时间与开始时间之间的差值。

更普遍 -

  1. 可以在另一个线程中启动长时间运行的任务。你需要自己研究这个;尝试谷歌搜索该短语。
  2. 事件驱动的编程可能更适合这个用例。为谷歌尝试“C++ 事件驱动的 IO”,或者其他什么。
于 2013-05-12T13:58:20.177 回答