Почему не вызывается вызов QTimer :: start () вне QThread (цикл обработки событий)? - PullRequest
3 голосов
/ 19 октября 2019

Документация гласит:

В многопоточных приложениях вы можете использовать QTimer в любом потоке, в котором есть цикл обработки событий. Чтобы запустить цикл обработки событий из потока без графического интерфейса, используйте QThread :: exec (). Qt использует сходство потоков таймера, чтобы определить, какой поток испустит сигнал timeout (). Из-за этого вы должны запускать и останавливать таймер в его потоке;невозможно запустить таймер из другого потока.

Так что я ожидаю, что этот код ...

int main(int argc, char *argv[])
{
  QCoreApplication app(argc, argv);
  QTimer timer;
  timer.start(1000);

  app.exec();

}

... завершится ошибкой, потому чтоОсновной поток, куда я звоню start, это не QThread, а Timers can only be used with threads started with QThread

ВОПРОС

Почему не 'Т это не удалось?

1 Ответ

3 голосов
/ 19 октября 2019

Похоже, вы не поняли правильно, что указывает документация, давайте проанализируем каждую часть утверждения:


В многопоточных приложениях вы можете использовать QTimer в любом потоке, который имеетцикл обработки событий.

Где вы использовали QTimer, есть ли цикл обработки событий? Да, вы используете QTimer в главном потоке и создали цикл обработки событий черезQXApplication.

Чтобы запустить цикл событий из потока без графического интерфейса, используйте QThread :: exec ()

Является ли основной поток не графическим интерфейсомthread? Нет, поэтому в этом случае нет необходимости использовать QThread для использования QTimer в главном потоке.

В каких случаях может произойти сбой QTimer? Если QTimer работаетв основном потоке, и вы не создали приложение QXApplication, или если вы запускаете его в потоке, где нет цикла событий Qt, как std :: thread.


Вывод:

Если QTimer используется в основном потоке, просто ruВ QXApplication, если вы хотите использовать его в другом потоке, вы должны использовать QThread. Другими словами, QTimer работает только при наличии цикла событий Qt.

...