Я пытаюсь выполнить задачу с интервалом, и я создал 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