我有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
,在这个阶段我得到了这样的错误:
顺便说一句,当我在OS X 10.11中运行它时,错误不会出现并且一切正常。我做错了什么,我该如何解决?
答案 0 :(得分:3)
remote_server->disconnect();
可能是这里的问题。
你不直接发送事件,但你调用该函数并在主线程中调用它。
尝试QMetaObject::invokeMethod(remote_server, "disconnect", Qt::QueuedConnection);
查看此问题是否仍然存在
欢呼声
答案 1 :(得分:0)
在移动到线程之前,您正在连接对象。这样Qt无法在新的中找到它。只要在所有事情发生之前转移到thrrqd,这应该可行。