【发布时间】: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:同意,尽管它确实是重复的,因为它已被多次询问。 ;)