Qt QTimer 以这种方式停止它是否安全
Qt QTimer is it safe to stop it this way?
在
Qt的"超时"信号/时隙功能中停止Qt的计时器是否安全?似乎无法在Qt文档中找到有关QTimer的任何信息。
我创建了一个计时器,该计时器定期向服务器发送"保持活动"消息。如果发送消息时出现某种错误,我希望停止此计时器。
private:
QTimer* mpKeepAliveTimer;
计时器初始化如下:
mpKeepAliveTimer = new QTimer(/* this */);
QObject::connect(mpKeepAliveTimer, SIGNAL(timeout()), this, SLOT(OnKeepAlive()));
mpKeepAliveTimer->start(KEEP_ALIVE_PERIOD);
像这样停止:
if (mpKeepAliveTimer != NULL) // <-- Edited
{
if (mpKeepAliveTimer->isActive() == true)
mpKeepAliveTimer->stop();
delete mpKeepAliveTimer;
mpKeepAliveTimer = NULL;
}
超时函数如下所示:
void Classname::OnKeepAlive()
{
if (isErrorFound == true)
mpKeepAliveTimer->stop(); // <---- IS THIS SAFE?
}
谢谢。
只要您没有显式使用排队连接,这是安全的.
这是因为emit timeout()
函数在处理它连接到的所有插槽之前不会返回。
但是,如果您使用的是排队连接,理论上可能会发生事件队列中仍有未处理的超时事件,因此要使其超级安全,您可以使用以下内容:
void Classname::OnKeepAlive()
{
if (!mpKeepAliveTimer || !mpKeepAliveTimer->isActive()) return;
if (isErrorFound)
{
mpKeepAliveTimer->stop();
}
}
请注意,停止函数中的条件应!= NULL
而不是== NULL
。但是,您也可以按如下方式编写该函数:
if (mpKeepAliveTimer)
{
delete mpKeepAliveTimer;
mpKeepAliveTimer = NULL;
}
正如评论中已经建议的那样,QTimer 将在其析构函数中停止自身。
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?
- 使用自己的迭代器分配容器是否安全?