【问题标题】:delete this in QTimer::singleShot [duplicate]在 QTimer::singleShot 中删除它 [重复]
【发布时间】:2014-07-18 12:44:17
【问题描述】:

在我的 qt 服务器应用程序中处理请求时,有时我必须等待“资源”空闲。据我了解,在插槽实现中休眠会停止消息循环,因此这可能无法按预期工作:

void MyClass::mySlot(/*some params here*/)
{
    while (resource.busy())
    {
        QThread::sleep(50);
        if (timeout)
            break;
    }
    if (!timeout) 
        doWork();
}

我曾想过使用 QTimer,例如单发。我的研究表明,我无法通过定时器的信号传递参数。

我的下一个方法是为每个请求创建一个新对象的实例,将参数放入此请求并使用此对象作为计时器信号的接收者。在这个插槽中,我必须删除请求对象,因为我没有存储对它的引用(并且不想)。

void MyClass::mySlot(/*some params here*/)
{
    Request* request;
    request->setParams(...);
    request->processRequest();
}

void Request::processRequest()
{
    if (resource.busy())
    {
        // timeout missing in example/pseudocode
        QTimer::singleShot(50, this, SLOT(processRequest()));
    }
    else
    {
        doWork();
        delete this; // allowed by C++, but ugly. allowed by qt? better approach?
    }
}

有没有更好的方法来释放请求对象,甚至有更好的方法来解决我的问题?如果不是:在这种情况下使用delete this; 是否有效?

【问题讨论】:

  • @πάνταῥεῖ 不重复(至少那个问题),这有一个 Qt 特定的答案。
  • 我不相信真的有 qt 特定的东西。在大多数情况下要求delete this 是错误的。
  • @πάνταῥεῖ QObject::deleteLater() 是对“有没有更好的方法”这个问题的 Qt 特定答案。
  • @πάνταῥεῖ:当您缺乏最低限度的理解时,您真的应该停止发表评论。 QObject::deleteLater() 存在是有正当理由的。它与“删除此线程”有什么关系,我不知道。遗憾的是,我们无法从顶部的引用中删除。
  • @hyde:同意,尽管它确实是重复的,因为它已被多次询问。 ;)

标签: c++ qt qtimer


【解决方案1】:

您可以使用QObject::deleteLater()。来自documentation :

计划删除此对象。该对象将被删除时 控制返回事件循环。如果事件循环没有运行 当这个函数被调用时(例如 deleteLater() 在一个 QCoreApplication::exec()) 之前的对象,该对象将被删除 一旦事件循环开始。如果 deleteLater() 在 主事件循环已停止,对象不会被删除。自 Qt 4.8,如果在一个没有运行事件循环的线程中调用deleteLater(),该对象将被销毁 线程完成。注意进入和离开一个新的事件循环 (例如,通过打开模式对话框)不会执行延迟 删除;对于要删除的对象,控件必须返回到 从中调用 deleteLater() 的事件循环。

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多