网络不阻止QT 4.7中的UI
-
29-09-2019 - |
题
我有一台服务器可以连接到该服务器。客户端是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,并让事件循环照常继续。在该插槽内完成连接的东西。
不隶属于 StackOverflow