Несколько потоков, как правильно создавать виджеты qt - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующее созвездие:

Поток qt gui с MainWindow

Другой поток, который по сути является CameraManager ... каждый раз, когда камера добавляется / удаляется MainWindow будет проинформировано.

Это выглядит примерно так:

Главное окно происходит от ICameraAddedConsumer

MainWindow, реализует ConsumeCameraAdded и создает виджет внутри этой функции.Он подписывается как потребитель на CameraManager

. CameraManager вызывает ConsumeCameraAdded всех своих потребителей (MainWindow) при добавлении новой камеры.

Проблема в том, что CameraManager живетв другом потоке, и Qt, очевидно, будет жаловаться на это, поскольку виджет не создан в том же потоке, в котором находилось главное окно.

Есть предложения, как мне это решить?

1 Ответ

0 голосов
/ 05 марта 2019

Согласно комментариям, использование сигналов / слотов между объектами QObjects в разных потоках должно решить проблему "автоматически".

Если исключить это и предположить, что MainWindow/ICameraAddedConsumer является QObject, можно использовать что-то вроде:

QMetaObject::invokeMethod(consumer, "ConsumeCameraAdded", Qt::QueuedConnection, ...)

где consumer - указатель на экземпляр MainWindow/ICameraAddedConsumer.

Там есть QWaitCondition, но я не уверен, что это имеет смысл в этом случае (хотя он может быть адаптирован, я полагаю).

В противном случае ... не создавайте виджет в ConsumeCameraAdded(), а установите там некоторый флаг (и верните), а затем используйте QTimer или QObject::timerEvent(), чтобы периодически проверять флаг и создавать виджетесли это установлено.К сожалению, я уверен, что вы не сможете создать или запустить таймер внутри ConsumeCameraAdded() из-за проблем с многопоточностью.

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