Qt QTimer 以这种方式停止它是否安全

Qt QTimer is it safe to stop it this way?

本文关键字:是否 安全 方式停 QTimer Qt      更新时间:2023-10-16

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 将在其析构函数中停止自身。