提问者:小点点

为什么我的工人在一个错误的线程中工作?


我有一个具有两个内部对象指针的类Messenger:

    std::unique_ptr<QThread> stdin_receiver_thread_ = nullptr;
    std::unique_ptr<ReceiverWorker> stdin_receiver_ = nullptr;

Messenger的构造函数中,我创建了这些对象并将它们分配给这些智能指针,如下所示:

Messenger::Messenger(QObject *parent) : QObject(parent) {

    // create the objects
    stdin_receiver_thread_ = std::make_unique<QThread>(); 
    stdin_receiver_ = std::make_unique<ReceiverWorker>();
    //
    qDebug() << "stdin_receiver_thread_:" << stdin_receiver_thread_.get()->thread();

    // I assign the worker to this the newly created thread
    stdin_receiver_->moveToThread(stdin_receiver_thread_.get());
    //

    connect(stdin_receiver_thread_.get(), &QThread::started, stdin_receiver_.get(), &ReceiverWorker::process);
    connect(stdin_receiver_.get(), &ReceiverWorker::receivedMessage, stdin_receiver_thread_.get(), &QThread::quit);
    connect(stdin_receiver_.get(), &ReceiverWorker::receivedMessage, stdin_receiver_.get(), &QObject::deleteLater);
    connect(stdin_receiver_thread_.get(), &QThread::finished, stdin_receiver_thread_.get(), &QObject::deleteLater);

    stdin_receiver_thread_->start();
}

在我的ReceiverWork::Process()中调用

qDebug() << "Receiverworker currentThread:" << QThread::currentThread();

现在,这两个qdebug()调用打印不同的值:即:

stdin_receiver_thread_: QThread(0x20a24e57ba0)
Receiverworker currentThread: QThread(0x20a2e6f58e0)

这就像ReceiverWorker在不同的线程中工作,而不是我想要的。 我做错了什么?


共2个答案

匿名用户

它在做它应该做的事。 术语stdin_receiver_thread_.get()->thread();生成Qthreadstdin_receiver_thread作为Qobject在其中生存。 换句话说,您的主线程或构造messenger的任何地方。

如果你只是写:

qDebug() << "stdin_receiver_thread_:" << stdin_receiver_thread_.get();

就会得到预期的输出。

std::unique_ptr<QThread>

您不应将std::unique_ptr与您调用DeleteLater()QObject一起使用。 这不可避免地导致双重释放/堆损坏。

匿名用户

您正在对QThread对象调用QObject::Thread()。 文档说:“返回对象所在的线程。” QThread是一个存在于主线程中的对象。 我认为您的函数按预期工作,只是没有为qdebug比较正确的值。