基本上我所拥有的是一个具有主GUI线程和工作线程的Qt应用程序。
工作线程是这样的:
void Client::readResults(int msgqid, pid_t pid)
{
int ret;
msg_t message;
connect(this, SIGNAL(dataReceived(QString)), this, SLOT(updateDisplay(QString)));
connect(this, SIGNAL(doneProcessing(QString)), this, SLOT(updateStatus(QString)));
for (;;)
{
ret = msgrcv(msgqid, &message, MSGSIZE, pid, 0);
if (ret == -1)
{
showStatusBarError("msgrcv");
return;
}
if (ret > 0)
{
emit dataReceived(QLatin1String(message.info));
if (message.is_eof)
{
emit doneProcessing("Done!");
break;
}
}
}
}
所有它的作用是从消息队列中读取并发出一个信号,该信号从主GUI线程(产生该线程)导致QPlainTextEdit小部件调用appendPlainText(message.info),以便从消息队列接收数据附加到窗口小部件。
问题是如果我从队列中读取大量数据(它实际上是一个大约30MB或更多的文本文件),整个GUI只会挂起,直到工作线程结束。有没有办法让它不挂起,让用户实际看到QPlainTextEdit小部件滚动,因为它从工作线程接收数据?
谢谢!
答案 0 :(得分:0)
之前我遇到过类似的问题。就我而言,根据我的经验,信号/插槽系统似乎锁定了程序流程。当您读入大量数据或经常读取某些数据时,自然会导致GUI速度变慢。
对我来说有用的是使用基于模型的输入,它可以实现稳定,平滑的更新。 您可能需要考虑重新定位输入,以便可以直接从输入读取GUI?