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

标签 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 中运行它时,不会出现错误并且一切正常。我做错了什么,我该如何解决?

最佳答案

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

您不直接发送事件,而是调用该函数,它会在您的主线程中被调用。

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

干杯

关于c++ - Qt 无法将事件发送到不同线程拥有的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34039637/

相关文章:

c++ - 如何防止 GDB 加载(大型)库的调试符号?

python - 如何使用 Python 从 gdb 访问 C++ 程序的变量

c++ - 临界区段错误 - 避免死锁

c++ - Qt中的空文件

java - 执行在同步块(synchronized block)之间卡住

Java : Thread calling Runnable

c++ - QT 窗口可以完全设计样式吗,包括在 Windows 7 或 Vista 上运行时的菜单栏吗?

c++ - 混合 std::move() 和 std::thread 不会编译

c++ - 如何在 Google 测试 (gtest) 中使用 fixture 成员值运行参数化测试?

c++ - 如何求解稀疏矩阵的线性方程 AX=b