События процесса Qt

у меня есть QString объект, который экспортируется в qml. В C++ Код, обновляя значение и отправляя измененный сигнал для свойства, не обновляет его, потому что поток занят: в то время я использую операцию cost в цикле for. Для этого я использую QCoreApplication::processEvents() чтобы иметь возможность излучать задержанные сигналы на каждой итерации цикла, как:

foreach(const QVariant& item, _manifestFile) {
setStatusString(QString("Checking file %1 of %2...").arg(currentProcessingFile++).arg(totalFilesCount));
QCoreApplication::processEvents();  // TODO remove
//...
}

куда setStatusString сеттер моего QString Переменная я описал выше:

void Updater::setStatusString(const QString &statusString) {
_statusString = statusString;

emit statusStringChanged();
}

Как я могу удалить это processEvents() и быть в состоянии излучать сигналы? Ценится любое решение: потоковое, объектные объекты Qt-meta и т. Д.

2

Решение

Вы должны создать свой объект класса Updater в куче и переместите его в новый поток, чтобы цикл for не блокировал основной поток и пользовательский интерфейс. Это можно сделать так:

updater = new Updater();
QThread * th = new QThread();
updater->moveToThread(th);

QObject::connect(th,SIGNAL(started()),updater,SLOT(OnStarted()));
QObject::connect(th,SIGNAL(finished()),updater,SLOT(OnFinished()));

QObject::connect(updater,SIGNAL(statusStringChanged(QString)),this,SLOT(updateString(QString)));

th->start();

Ваши задачи инициализации и завершения в классе Updater должно быть сделано в OnStarted() а также OnFinished() слоты соответственно.

Теперь вы можете излучать сигнал с соответствующим значением, которое будет поставлено в очередь и обработано в соответствующее время. Вы можете излучать сигнал по таймеру периодически через определенные промежутки времени, чтобы предотвратить слишком частую передачу.

И последнее, что вы не должны звонить Updater функционирует напрямую, когда он находится в другом потоке. Правильный способ — определить функции как слоты и подключить сигнал к этому слоту и подать сигнал, когда вы хотите вызвать определенную функцию.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector