Оптимизация виджета QPlainTextEdit Когда бомбардируется данными? - PullRequest
1 голос
/ 09 февраля 2012

Итак, в основном у меня есть приложение 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;
            }
        }
    }
}

Все, что он делает, это читает из очереди сообщений и выдает сигнал, который заставляет виджет QPlainTextEdit из основного потока GUI (который породил этот поток) вызывать appendPlainText (message.info), чтобы данные, полученные из очереди сообщений добавляется к виджету.

Проблема в том, что если я читаю огромные порции данных из очереди (это на самом деле текстовый файл размером около 30 МБ или более), весь графический интерфейс пользователя просто зависает, пока рабочий поток не завершит работу. Есть ли способ сделать так, чтобы он не зависал, и чтобы пользователь действительно видел прокрутку виджета QPlainTextEdit при получении данных из рабочего потока?

Спасибо!

1 Ответ

0 голосов
/ 09 февраля 2012

У меня раньше была похожая проблема. В моем случае, и из моего опыта, система Сигнал / Слот, кажется, блокирует ход программы. Когда вы читаете много данных или часто читаете некоторые данные, это, естественно, приведет к замедлению работы графического интерфейса.

Что мне помогло, так это использование основанного на модели ввода, что позволяет постоянно и плавно обновлять. Возможно, вы захотите переместить вход, чтобы вы могли непосредственно читать данные с входа в графический интерфейс?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...