0

我有一个服务器,多个客户端可以连接到该服务器。客户端是 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 相当陌生,我不知道我正在做的事情是否正确。

有人可以告诉我我正在做的事情是否是一个好方法,如果是,为什么我的程序会崩溃?

4

2 回答 2

2

最好的办法是永远不要调用诸如 waitForBlah() 之类的方法……强制事件循环等待一段未确定的时间会导致 GUI 在此期间冻结的可能性。相反,将您的 QTcpSocket 的 connected() 信号连接到将适当更新您的 GUI 的某个插槽,并让事件循环照常继续。在那个插槽内做你连接的东西。

于 2010-11-28T22:47:03.857 回答
-1

我不建议在构造函数中启动线程。

像这样初始化它:

Client * client = new Client();
client->moveToThread(client);
client->start();

或者,如果您不想使用此类解决方案,请start();在行前添加构造函数this->moveToThread(this);

upd:对不起,我第一次没有看到你有这个字符串。

于 2010-11-28T19:28:51.460 回答