блоки std :: cout при нажатии в окне консоли? - PullRequest
0 голосов
/ 12 июля 2019

Я пытаюсь выполнить задачу с интервалом, и я создал POC, используя boost :: asio :: stable_timer.

В итоге все в порядке с таймером.

Попробуйте следующий тест:

  • Запустите программу и не трогайте мышь
  • Наблюдать за обновлением вывода окна консоли каждую секунду

Теперь попробуйте этот тест:

  • Запустить программу снова
  • Дайте ему немного поработать и наблюдать, как вывод обновляется каждую секунду
  • Установить точку останова внутри обратного вызова таймера
  • Щелкните левой кнопкой мыши в окне консоли
  • Обратите внимание, что обратный вызов таймера больше не срабатывает
  • Щелкните правой кнопкой мыши на окне консоли
  • Заметим, что программа продолжает работать как обычно

Может кто-нибудь объяснить это поведение? Блокирует ли std :: cout, когда вы щелкаете левой кнопкой мыши в окне консоли, пока вы не щелкаете по нему правой кнопкой мыши?

#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(1));
        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
        {
            // Do stuff here later

            m_timer.expires_from_now(std::chrono::seconds(1));
            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;
}

Использование:

  • повышение 1.70.0 от Nuget вместе с библиотеками vc-142
  • Visual Studio 2019
...