gpt4 book ai didi

c++ - QRunnable 发出信号并从插槽中获取发送者

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:10 26 4
gpt4 key购买 nike

QRunnable 在完成后被 QThreadPool 销毁。当我从它发出信号并尝试使用 sender() 从槽中获取 QRunnable 对象时,它为 NULL。

最小的例子:

// class MyRunnable : public QObject, public QRunnable
MyRunnable::run()
{
//... do some work
emit onFinished();
}

// constructor by request
MyRunnable::MyRunnable(QObject *parent) : QObject(parent),
m_someData(1),
{
}

...
private slots:
void onFinished()
{
MyRunnable* myRunnable = qobject_cast<MyRunnable*>(sender());
int val = myRunnable->getSomething(); // myRunnable is null and it crashes
}
...

// later I start it using some thread pool
MyRunnable* myRunnable = new MyRunnable;
connect(myRunnable, SIGNAL(onFinished()), this, SLOT(onFinished());
threadPool.start(myRunnable);

有什么方法可以指定何时删除此对象?这样我就可以安全地访问它在我的插槽中的数据成员了吗?

最佳答案

您想在对象被销毁后访问它的成员。显然,您不能安全地这样做。

另外,强制转换 sender() 以直接访问它是一个危险信号 - 无论是在不必要的耦合方面还是在线程安全方面。

相反,您可能希望将相关成员复制到信号中:

MyRunnable::run()
{
//... do some work
emit onFinished(getSomething());
}

并简单地在监听器中使用结果。


如果你真的相信你必须控制可运行的生命周期,你可以观察到

the thread pool takes ownership of the runnable if runnable->autoDelete() returns true

因此您可以覆盖 autoDelete() 以返回 false,然后从您的槽中调用其 deleteLater() 方法。直接访问它的成员时要小心,因为它仍然是一个线程池线程。

关于c++ - QRunnable 发出信号并从插槽中获取发送者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44891164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com