Итак, в основном у меня есть приложение 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 при получении данных из рабочего потока?
Спасибо!