C ++ Timer暂停执行程序直到完成

时间:2013-08-04 00:59:45

标签: c++ multithreading c++11 timer

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:调用t1.detach()而不是join似乎有效。

2 个答案:

答案 0 :(得分: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));
}

输出: 启动线程调用者。 启动并发线程。 退出线程调用者。 退出并发线程。

我们看到并发线程在线程调用者结束后结束。如果未调用分离,则无法执行此操作。

希望有所帮助,但杰森找到了解决方案。

答案 1 :(得分: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;
    }
};