C++11 监视器类,测试应用程序不想退出
C++11 Watchdog class, test application doesn't want to exit
我正在使用在线C++11
编译器,链接,此处找到:cpp.sh(c shell)。
在我当前的项目中,我想拥有一个看门狗类,以便能够以某种方式检查线程或FSM的状态(例如)。
经过一些工作(我不是C++11
大师),我终于得到了下面的代码,可以编译好的。
我也做了一些基本/微不足道的测试,但似乎测试程序不想退出。
它说"运行程序",而(强制)退出的唯一方法是击中" stop "按钮... :(
好吧,我的问题:我在做什么错?
高度赞赏您可以提供的任何想法,您可以提供的建议。
这是full code
,包括我的测试应用:
看门狗(AS MCVE):
#include <thread>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <mutex>
#include <iostream>
using namespace std::chrono;
class Watchdog
{
public:
Watchdog();
~Watchdog();
void Start(unsigned int milliseconds, std::function<void()> callback = 0);
void Stop();
void Pet();
private:
unsigned int m_interval;
std::atomic<bool> m_running;
std::thread m_thread;
std::function<void()> m_callback;
std::mutex m_mutex;
steady_clock::time_point m_lastPetTime;
std::condition_variable m_stopCondition;
void Loop();
};
Watchdog::Watchdog()
{
m_running = false;
}
Watchdog::~Watchdog()
{
Stop();
}
void Watchdog::Start(unsigned int milliseconds, std::function<void()> callback)
{
std::unique_lock<std::mutex> locker(m_mutex);
if(m_running == false)
{
m_lastPetTime = steady_clock::now();
m_interval = milliseconds;
m_callback = callback;
m_running = true;
m_thread = std::thread(&Watchdog::Loop, this);
}
}
void Watchdog::Stop()
{
std::unique_lock<std::mutex> locker(m_mutex);
if(m_running == true)
{
m_running = false;
m_stopCondition.notify_all();
m_thread.join();
}
}
void Watchdog::Pet()
{
std::unique_lock<std::mutex> locker(m_mutex);
m_lastPetTime = steady_clock::now();
m_stopCondition.notify_all();
}
void Watchdog::Loop()
{
std::unique_lock<std::mutex> locker(m_mutex);
while(m_running == true)
{
if(m_stopCondition.wait_for(locker, milliseconds(m_interval)) == std::cv_status::timeout)
{
if(m_callback != nullptr)
m_callback();
}
}
}
int main(int argc, char *argv[])
{
Watchdog wdog;
wdog.Start(3000, [] { std::cout << " WDOG TRIGGERED!!! "; });
for(auto i = 0; i < 10; i++)
{
std::cout << "[+]";
wdog.Pet();
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
-
您在这里做一个僵局。
void Watchdog::Stop()
{
std::unique_lock<std::mutex> locker(m_mutex);
if(m_running == true)
{
m_running = false;
m_stopCondition.notify_all();
m_thread.join();
^ ~~~~~~~~~~~~~~
m_mutex is locked; m_thread cannot continue execution
}
}
一些其他建议:使用简单的if
条件,请勿与true
或false
进行比较。
相关文章:
- Qt应用程序不响应鼠标和键盘事件
- 剥离C++库中的应用程序不需要的代码
- 发送到64位应用程序不起作用
- 如何使用退货应用程序不阻止此代码
- C++11 监视器类,测试应用程序不想退出
- Gdiplus::P mathGradientBrush in a MFC 应用程序不绘制
- 我能断定我的应用程序不会导致内存泄漏吗
- 为什么C++应用程序不能创建像php,html和css这样的接口?
- CIS115 成绩簿应用程序不添加成绩
- C 中的内容可以使Windows 8应用程序不在手臂上运行
- 默认的Qt控制台应用程序不会"Hello World"...或做任何其他事情
- 为什么Qt应用程序不给我异常或错误
- 控制台应用程序不会立即关闭
- C++应用程序不会终止
- 发布的应用程序与原始应用程序不一样
- mysql 远程连接 - mysql CL 客户端工作,C++应用程序不工作
- 如何使我的 Visual C++ 2013 应用程序不需要下载可再发行组件包
- Qt应用程序不会退出
- C++ 银行应用程序不持有多个帐户
- 控制台应用程序不打印"Press any key to continue . . ."