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似乎有效。
答案 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;
}
};