Kill Boost thread с другим потоком таймаута

Я хочу закончить тему 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();
}

2 ответа

Решение

Вы могли бы использовать сон:

#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();
}

Это имеет минимальное преимущество, будучи портативным.

Смотрите это в прямом эфире на Coliru

Пожалуйста, будьте в курсе deadline_timer класс в Boost Asio тоже.

И похоже, что вы пытаетесь дождаться состояния в вашем рабочем потоке. Если это так, вы также можете ждать condition_variable с крайним сроком (cv.wait_until или с таймаутом: cv.wait_for).

Просто проверьте время в рабочем потоке, и вам не понадобится отдельный поток времени ожидания:

void WorkerThread() 
{
    DWORD nStartTime = GetTickCount();
    while(boost::this_thread::interruption_requested() == false && GetTickCount() - nStartTime < 15000) 
    {
        printf(".");

    }
}

Кстати, пожалуйста, обратите внимание 15000потому что единицы измерения GetTickCount() - это миллисекунды

Другие вопросы по тегам