从线程中分离对象
Detach object from thread
一个简单的问题:是否可以将QObject从QThread分离,以便将其移动到主线程?
我使用以下代码:
QThread *thread = new QThread();
MyObject *object = new MyObject();
object->moveToThread(thread);
thread->start();
然后我想把MyObject
实例移到主线程中。
object->moveToThread(QApplication::instance()->thread());
我有以下错误:QObject::moveToThread: Current thread (0x00000001) is not the object's thread (0x00000002). Cannot move to target thread (0x00000003)
。
感谢
正如官方文档所说,moveToThread
函数不能从另一个线程"拉"一个对象,而是将一个对象"推"到另一个螺纹。
这就是为什么如果您想更改对象的线程相关性,则应该在当前对象的线程中进行更改。
我添加了一个简单的例子。
这是Worker
类:
class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = 0);
signals:
void done();
public slots:
void doWork();
void checkThread();
private:
bool isMainThread();
};
Worker::Worker(QObject *parent) :
QObject(parent)
{
qDebug() << __PRETTY_FUNCTION__
<< QThread::currentThread()
<< isMainThread();
}
void Worker::doWork()
{
qDebug() << __PRETTY_FUNCTION__
<< QThread::currentThread()
<< isMainThread();
qDebug() << __PRETTY_FUNCTION__ << "Work is done";
moveToThread(qApp->thread());
emit done();
}
void Worker::checkThread()
{
qDebug() << __PRETTY_FUNCTION__
<< QThread::currentThread()
<< isMainThread();
}
bool Worker::isMainThread()
{
return QThread::currentThread() == qApp->thread();
}
我们创建了一个Worker
对象和一个QThread
对象,并将它们相互连接:
QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);
QObject::connect(thread, SIGNAL(started()), worker, SLOT(doWork()));
QObject::connect(worker, SIGNAL(done()), thread, SLOT(quit()));
QObject::connect(thread, SIGNAL(finished()), worker, SLOT(checkThread()));
QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
这就是我们在应用程序输出中得到的:
Worker::Worker(QObject*) QThread(0x1034680) true
void Worker::doWork() QThread(0x1224970) false
void Worker::doWork() Work is done
void Worker::checkThread() QThread(0x1034680) true
在主应用程序线程中创建一个Worker
对象,然后它在一个新线程中完成工作。作业完成后,它发送done()
信号,并将自己移回主线程。线程完成后,我们再次检查Worker
对象是否真的在主线程中。
但我真的不明白你为什么需要这个。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 访问全局或静态对象的分离线程
- 添加可绘制对象层以将逻辑与图形分离
- 如何在OpenGL中分离不透明对象和透明对象
- 在静态语言中分离和合并由数据库表组成的对象
- C++分离了对象的定义和构造函数
- 是否有可能从std::string对象中分离char*指针?
- 分离构造或克隆对象
- 从线程中分离对象
- c++分离线程在其关联对象被删除后继续工作
- 对象的分离向量
- 不能使用已与其底层RCW分离的COM对象