Qt无法将事件发送到不同线程拥有的对象

时间:2015-12-02 09:53:27

标签: c++ multithreading qt

我有mainwindow类,里面有这样的插槽:

void MainWindow::connect_to_server(const std::string& nickname,
                                   const std::string& ip, 
                                   int port)
{

    remote_server = new Server(nickname, ip, port);

    connect(remote_server, SIGNAL(error()), SLOT(connection_failed()));

    auto thread = new QThread(this);
    remote_server->moveToThread(thread);

    connect(thread, SIGNAL(started()), remote_server, SLOT(establish_connection()));
    connect(remote_server, SIGNAL(stop_thread()), thread, SLOT(quit()));

    thread->start();
}

void MainWindow::action_disconnect_triggered() {
    if (remote_server == nullptr) {
        return;
    }
    remote_server->disconnect();
    remote_server = nullptr;
}

Server课程:

void Server::establish_connection() {
    master_socket = std::move(
                std::unique_ptr<QTcpSocket>(new QTcpSocket(nullptr))
                );

    master_socket->connectToHost(ip.c_str(), port);
    master_socket->waitForConnected(timeout*1000);

    if (master_socket->state() == QAbstractSocket::UnconnectedState) {
        disconnect();
        emit error();
    }

    emit stop_thread();
}

void Server::disconnect() {
    if (master_socket) {
        master_socket->disconnectFromHost();
    }
}

最初,我调用客户端成功连接到远程服务器的MainWindow::connect_to_server。然后,我调用MainWindow::action_disconnect_triggered,在这个阶段我得到了这样的错误:

enter image description here

顺便说一句,当我在OS X 10.11中运行它时,错误不会出现并且一切正常。我做错了什么,我该如何解决?

2 个答案:

答案 0 :(得分:3)

remote_server->disconnect();可能是这里的问题。

你不直接发送事件,但你调用该函数并在主线程中调用它。

尝试QMetaObject::invokeMethod(remote_server, "disconnect", Qt::QueuedConnection);查看此问题是否仍然存在

欢呼声

答案 1 :(得分:0)

在移动到线程之前,您正在连接对象。这样Qt无法在新的中找到它。只要在所有事情发生之前转移到thrrqd,这应该可行。