我有一个服务器,多个客户端可以连接到该服务器。客户端是 GUI,而服务器是命令行。客户端有几个功能(例如连接和登录),当发送到服务器时应该收到回复。
基本上我需要运行 QTcpSocket 函数 waitForConnection 和 waitForReadyRead。但是,我需要在不阻塞 UI 的情况下执行此操作。
我想做的是:让一个类(客户端)实现 QThread 来完成所有的等待。这是在 main.js 中创建的。
Client::Client (...)
{
moveToThread (this); // Not too sure what this does
mClient = new QTcpSocket (this);
start();
}
void Client::run (void)
{
exec();
}
void Client::connectToServer (...)
{
mClient->connectToHost (hostname, port);
bool status = mClient->waitForConnected (TIMEOUT);
emit connected (status);
}
void Client::login (...)
{
... Similar to connectToServer ...
}
然后,每当我准备好建立连接时,我都会运行 GUI(例如,ConnectToServerDialog)。我将线程中的“已连接信号”连接到对话框,因此当我连接或连接超时时,它将发出此信号。
QMetaObject::invokeMethod (mClient, "connectToServer", Qt::QueuedConnection,
Q_ARG (const QString &, hostname), Q_ARG (quint16, port));
我遇到了一个断言失败(无法将事件发送到不同线程拥有的对象。)由于我对 Qt 相当陌生,我不知道我正在做的事情是否正确。
有人可以告诉我我正在做的事情是否是一个好方法,如果是,为什么我的程序会崩溃?