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

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 回答