我有一台服务器可以连接到该服务器。客户端是GUI,而服务器为命令行。客户端具有多个功能(例如连接和登录),将其发送到服务器时应收到答复。

基本上,我需要运行qtcpsocket WaitforConnection和WaitForreDyread。但是,我需要在不阻止UI的情况下执行此操作。

我想做的是以下内容:让一个班级(客户端)实现qthread,以完成所有等待。这是主要创建的。

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的新事物,所以我不知道我在做什么是正确的事情。

有人可以告诉我我在做什么是一种很好的方法,如果这样,为什么我的程序崩溃了?

有帮助吗?

解决方案

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

像以下初始化:

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

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

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

其他提示

最好的事情是不要调用Waitforblah()等方法...强迫事件循环等待不确定的时期会引入GUI在此期间冻结的可能性。取而代之的是,将QTCPSOCTED的Connected()信号连接到某个插槽,该插槽将适当地更新您的GUI,并让事件循环照常继续。在该插槽内完成连接的东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top