在QTimer :: singleShot中删除它

时间:2014-07-18 12:44:18

标签: c++ qt qtimer

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

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

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

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

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;是否有效?

1 个答案:

答案 0 :(得分:3)

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

  

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