boost :: asio :: устойчивый_тимер прекращает стрельбу - PullRequest
0 голосов
/ 31 мая 2019

Я написал следующую небольшую тестовую программу-драйвер для проверки некоторых событий мыши в другом приложении Windows.

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

Это не дает мне никаких исключений или кодов ошибок. Я просто вижу выход из двух потоков в окне вывода Visual Studio.

Чего мне не хватает?

#include <boost/asio.hpp>
#include "boost/asio/deadline_timer.hpp"
#include<boost/bind.hpp>
#include <chrono>
#include <iostream>

class Pooper
{
    boost::asio::io_context & m_ioContext;
    boost::asio::steady_timer m_timer;

public:
    Pooper(boost::asio::io_context & ioContext)
        :
        m_ioContext(ioContext)
        , m_timer(boost::asio::steady_timer(ioContext))
    {
    }

    void Run()
    {
        m_timer.expires_from_now(std::chrono::seconds(5));
        m_timer.async_wait(boost::bind(&Pooper::OnTimerExpired, this, boost::asio::placeholders::error));
    }

    void OnTimerExpired(const boost::system::error_code & error)
    {
        if (error.failed())
        {
            std::cerr << "boost error: Failed" << std::endl;
        }

        std::cout << "Poop" << std::endl;

        try
        {
            // Move the mouse
            int x = 500;
            int y = 500;
            if (!::SetCursorPos(x, y))
            {
                int errorCode = GetLastError();
                std::cerr << "SetCursorPos error: " << errorCode << std::endl;
            }

            // Left button down
            x = 65536 * 500;
            y = 65536 * 500;
            ::mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, x, y, NULL, NULL);

            // Left button up
            x = 65536 * 500;
            y = 65536 * 500;
            ::mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, x, y, NULL, NULL);

            m_timer.expires_from_now(std::chrono::seconds(5));
            m_timer.async_wait(boost::bind(&Pooper::OnTimerExpired, this, boost::asio::placeholders::error));
        }
        catch (std::exception &)
        {
            std::cerr << "An exception occured." << std::endl;
        }
    }
};

int main()
{
    boost::asio::io_context ioContext;
    auto pooper = Pooper(ioContext);
    pooper.Run();
    ioContext.run();

    std::cerr << "Exited..." << std::endl;
}
...