在对数据进行轰炸时优化QPlainTextEdit小部件?

时间:2012-02-09 06:11:19

标签: c++ linux qt

基本上我所拥有的是一个具有主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小部件滚动,因为它从工作线程接收数据?

谢谢!

1 个答案:

答案 0 :(得分:0)

之前我遇到过类似的问题。就我而言,根据我的经验,信号/插槽系统似乎锁定了程序流程。当您读入大量数据或经常读取某些数据时,自然会导致GUI速度变慢。

对我来说有用的是使用基于模型的输入,它可以实现稳定,平滑的更新。 您可能需要考虑重新定位输入,以便可以直接从输入读取GUI?