«QObject :: startTimer: таймеры нельзя запустить из другого потока» без таймеров - PullRequest
8 голосов
/ 18 июля 2011

Я создал многопоточное приложение в Qt (4.7.2). Только основной поток имеет цикл обработки событий.

Проблема в том, что иногда Я получаю следующее предупреждение в консоли:

QObject::startTimer: timers cannot be started from another thread

После этого приложение потребляет 100% ЦП (у меня одноядерный ЦП). Кажется, что основной поток потребляет все ресурсы процессора. Программа не зависает, и все еще работает.

Когда я останавливаю программу в отладчике, я не вижу свой код в стеке вызовов.

Проблема в том, что Я вообще не использую (явно, во всяком случае) таймеры.

С чем это может быть связано? Я знаю, что этот вопрос очень распространен, но я даже не могу понять, какой фрагмент кода показать.

1 Ответ

9 голосов
/ 19 июля 2011

Спасибо, @vrince, я исправил проблему.Я использовал механизм сигналов / слотов + Qt::QueuedConnection для связи с GUI

Например, если мне нужно установить текст QLabel из рабочего потока, я могу сделать в своем рабочем потоке сигнал

void textChanged(QString);

затем я подключаю этот сигнал к слоту QLabel, используя Qt::QueuedConnection

connect(worker, SIGNAL(textChanged(QString)), label, SLOT(setText(QString), Qt::QueuedConnection);

Если я хочу выполнить setText синхронно, я могу использовать Qt::BlockingQueuedConnection

теперь в моем рабочем потоке я просто излучаю сигнал:

emit textChanged(newText);

Также возможно использовать функции QMetaObject, чтобы избежать сигналов и слотов:

metaObject->invokeMethod(label, "setText", Qt::QueuedConnection, Q_ARG(QString, text));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...