It looks like my problems aren't with the timer at all. This listing pretty much mimicked example 3.
It ends up that my problem is that if you click on a console window in windows 10, the program ceases execution when it enters "quick edit" mode. I was not aware of that new behavior and thought the timer was not working. The program run fine, as is, if you don't touch the mouse.

Sorry, false alarm.

On Thu, Jul 11, 2019 at 7:42 PM Christopher Pisz <christopherpisz@gmail.com> wrote:
I am trying to perform a task on an interval and I made a POC using boost::asio::steady_timer. When I debug it, it only performs the callback once and does not fire again. I am not sure what I am doing wrong. Any suggestions?

    // DoMouseEvents.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //

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