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()、future オブジェクトを呼び出して非同期計算に参加し、その結果を取得します (まだ終了していない場合は、終了するまで待機します)。

于 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. このユースケースには、イベント駆動型プログラミングの方が適している場合があります。Googleなどの「C++イベント駆動型IO」を試してください。
于 2013-05-12T13:58:20.177 に答える