Как создать TimerHandler с помощью библиотеки Boost - PullRequest
1 голос
/ 17 мая 2011

Я работаю над проектом с использованием C ++.

Я хочу, чтобы TimerHandler вызывался через указанное время, но в то же время я не хочу блокировать текущий поток или любой код после io.run () в следующем коде:

#include <iostream>
#include <string>
#include <boost/format.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class TimerTest
{
public:
    static void PrintOutTimerHandler(const boost::system::error_code&, const std::string& message)
    {
        std::cout << "PrintOutTimerHandler called: " << ", message: " << message << std::endl;
    }

    void run()
    {
        boost::asio::io_service io;
        boost::asio::deadline_timer dt(io, boost::posix_time::seconds(5));

        std::cout << "Start:\t" << std::endl;

        dt.async_wait(boost::bind(PrintOutTimerHandler, boost::asio::placeholders::error, std::string("here is the message")));

        // Do some job here
        for (int i = 0; i < 1000000; ++i)
            ++i, --i;

        std::cout << "End:\t" << std::endl;

        io.run();

        std::cout << "When to reach here 1: " << std::endl;
    }
};

int main()
{
    TimerTest tt;
    tt.run();

    std::cout << "When to reach here 2: " << std::endl;

    return 0;
}

/* Current output:
Start:
End:
PrintOutTimerHandler called: , message: here is the message
When to reach here 1:
When to reach here 2:
 */

/* Expected output:
Start:
End:
When to reach here 1:
When to reach here 2:
PrintOutTimerHandler called: , message: here is the message
 */

Кажется, я ясно дал понять. Мои вопросы:

  • Если это можно решить без представляя новую тему, как Flex ActionScript, это лучший, но Я думаю, нет (я думаю, ActionScript используя скрытую ветку);
  • Если мы должны ввести дополнительную тему, чтобы сделать работа, не могли бы вы записать псевдокод для меня?

Спасибо.

Peter

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Вот пример. Запустите io_service в отдельном потоке

asio::io_service io_service;
asio::thread t(boost::bind(&asio::io_service::run, &io_service));

или запустить его в группе потоков

boost::thread_group threads;
for (std::size_t i = 0; i < my_thread_count; ++i)
    threads.create_thread(boost::bind(&asio::io_service::run, &io_service));

Помните, что ваш основной поток всегда должен запускаться, потому что, когда он существует, все потоки, которые создаются, также завершаются.

Надеюсь, это поможет.

1 голос
/ 18 мая 2011

Я неправильно понял, что сказал OrcunC, но на самом деле он прав. Вот измененная версия для вашей справки:

#include <iostream>
#include <string>
#include <boost/format.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class TimerTest
{
public:
    static void PrintOutTimerHandler(const boost::system::error_code&, const std::string& message)
    {
        std::cout << "PrintOutTimerHandler called: " << ", message: " << message << std::endl;
    }

    TimerTest(unsigned int timeout)
        : dt(io, boost::posix_time::milliseconds(timeout))
    {
    }

    void run()
    {
        std::cout << "Start:\t" << std::endl;

        dt.async_wait(boost::bind(PrintOutTimerHandler, boost::asio::placeholders::error, std::string("here is the message")));

        boost::thread thrd(boost::bind(&boost::asio::io_service::run, &io));

        // Do some job here
        for (int i = 0; i < 1000000; ++i)
            ++i, --i;

        std::cout << "End:\t" << std::endl;

        std::cout << "When to reach here 1: " << std::endl;
    }

    boost::asio::io_service     io;
    boost::asio::deadline_timer dt;
};

int main()
{
    TimerTest tt(5000);
    tt.run();

    std::cout << "When to reach here 2: " << std::endl;

    // Keep the main thread active for testing purpose. Otherwise,
    // once the TimerTest object is destroyed when exiting the main() function,
    // the sub thread spawed in tt.run() will also exit;
    Sleep(10000);
}

/* Current output and Expected output:
Start:
End:
When to reach here 1:
When to reach here 2:
PrintOutTimerHandler called: , message: here is the message
 */
...