3

C++、XCode 4.6.3、OSX 10.8.2、iOS へのデプロイ

時限イベントを作成しようとしています。

私の考えたプロセスは、スレッドを作成し、その中でタイミングを取り、最後に別の関数を呼び出すことでした。これは機能していますが、プログラムの残りの部分を一時停止しています。

//Launch a thread
std::thread t1(start_thread);

//Join the thread with the main thread
t1.join();

void start_thread()
{
    std::cout << "thread started" << std::endl;

    auto start = std::chrono::high_resolution_clock::now();

    std::this_thread::sleep_until(start + std::chrono::seconds(20));

    stop_thread();
}

void stop_thread()
{
    std::cout << "thread stopped." << std::endl;
}

プログラムの実行を一時停止しない方法はありますか?

アップデート:

ヘッダー ファイルでスレッドを宣言し、stop_thread() に参加することができます。

void stop_thread()
{
    std::cout << "thread stopped." << std::endl;
    ti.join();
}

しかし、それはスローします:

タイプ 'std::thread' は呼び出し演算子を提供しません

更新 2: join の代わりに t1.detach() を呼び出すとうまくいくようです。

4

2 に答える 2

1

あなたは正しいです:これはcppリファレンス http://en.cppreference.com/w/cpp/thread/thread/detachからの例です

#include <iostream>
#include <chrono>
#include <thread>

void independentThread() 
{
    std::cout << "Starting concurrent thread.\n";
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << "Exiting concurrent thread.\n";
}

void threadCaller() 
{
    std::cout << "Starting thread caller.\n";
    std::thread t(independentThread);
    t.detach();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "Exiting thread caller.\n";
}

int main() 
{
    threadCaller();
    std::this_thread::sleep_for(std::chrono::seconds(5));
}

出力: スレッドの呼び出し元を開始します。並行スレッドを開始しています。スレッド呼び出し元を終了します。並行スレッドを終了します。

スレッドの呼び出し元が終了した後、並行スレッドが終了することがわかります。detach が呼び出されない場合、これは不可能です。

それが役立つことを願っていますが、ジェイソンは解決策を見つけました.

于 2013-08-17T20:17:57.707 に答える
0

代わりにクラスを使用してください。

enum{ PAUSED, STARTED, STOPPED };

class AsyncEvent
{
protected:
    unsigned char mState;

public:
    AsyncEvent():mState(PAUSED){ mThread = std::thread(&AsyncEvent::run,this); }
    ~AsyncEvent(){ mThread.join(); }

private:
    std::thread mThread;

    void run()
    {
        std::cout << "thread started" << std::endl;

        while(mState != STOPPED)
        {
            if(mState == PAUSED)break;

            auto start = std::chrono::high_resolution_clock::now();
            std::this_thread::sleep_until(start + std::chrono::seconds(20));
        }
    }

    void stop()
    {
        mState = STOPPED;
    }

    void pause()
    {
        mState = PAUSED;
    }
};
于 2013-08-04T02:01:43.680 に答える