我希望在经过一段时间后结束一个帖子WorkerThread
。
我想为此使用第二个线程TimeoutThread
,在15秒后更改一个标志,以便另一个线程停止。
有没有更优雅的方式来提升这一点?
#include <boost/thread.hpp>
struct MyClass
{
boost::thread timeoutThread;
boost::thread workerThread;
bool btimeout = true;
void run()
{
timeoutThread = boost::thread(boost::bind(&MyClass::TimeoutThread, this));
workerThread = boost::thread(boost::bind(&MyClass::WorkerThread, this));
workerThread.join();
TimeoutThread.join();
}
void WorkerThread() {
while(boost::this_thread::interruption_requested() == false && btimeout)
{
printf(".");
}
}
void TimeoutThread()
{
boost::this_thread::disable_interruption oDisableInterruption;
DWORD nStartTime = GetTickCount();
while(boost::this_thread::interruption_requested() == false)
{
if(GetTickCount() - nStartTime > 15)
{
m_bTimeout = false;
break;
}
}
}
};
int main()
{
MyClass x;
x.run();
}
答案 0 :(得分:1)
你可以使用睡眠:
#include <boost/thread.hpp>
struct MyClass
{
boost::thread timeoutThread;
boost::thread workerThread;
void TimeoutThread() {
boost::this_thread::sleep_for(boost::chrono::milliseconds(15));
workerThread.interrupt();
}
void WorkerThread() {
while(!boost::this_thread::interruption_requested())
{
//Do stuff
}
}
void run()
{
timeoutThread = boost::thread(boost::bind(&MyClass::TimeoutThread, this));
workerThread = boost::thread(boost::bind(&MyClass::WorkerThread, this));
workerThread.join();
timeoutThread.join();
}
};
int main()
{
MyClass x;
x.run();
}
这具有便携性的最小好处。
请注意Boost Asio中的deadline_timer
课程。
看起来你正试图在你的工作线程中等待一个条件。如果是这样,您还可以等待condition_variable
的截止日期(cv.wait_until
或超时:cv.wait_for
)。
答案 1 :(得分:0)
只需检查工作线程中的时间,您就不需要单独的超时线程:
void WorkerThread()
{
DWORD nStartTime = GetTickCount();
while(boost::this_thread::interruption_requested() == false && GetTickCount() - nStartTime < 15000)
{
printf(".");
}
}
BTW,请注意15000
,因为GetTickCount()单位毫秒