0

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

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;在这种情况下使用是否有效?

4

1 回答 1

3

您可以使用QObject::deleteLater(). 从文档中:

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

于 2014-07-18T12:55:26.677 回答