Должен ли я использовать сигнал / слот как можно больше в Qt? - PullRequest
1 голос
/ 19 марта 2020

Из документации Qt по вопросам производительности и предложениям Я получил следующее:

use asynchronous, event-driven programming wherever possible

Я не уверен, что это значит, поэтому хотел бы спросить. Означает ли это, что я должен использовать сигнал / слоты всякий раз, когда это возможно (потому что они асинхронные?)?

1 Ответ

4 голосов
/ 19 марта 2020

Сигналы / слоты Qt не обязательно являются асинхронными. Начиная с https://doc.qt.io/qt-5/threads-qobject.html:

Прямое подключение: слот вызывается немедленно, когда излучается сигнал. Слот выполняется в потоке эмиттера, который не обязательно является потоком получателя.

Соединение в очереди: слот вызывается, когда управление возвращается к событию l oop потока получателя. Слот выполняется в потоке получателя.

Блокирование соединения с очередями: Слот вызывается так же, как и для соединения с очередями, за исключением текущих потоковых блоков до тех пор, пока слот не вернется.

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

Кроме того, да, вам, вероятно, следует использовать «асинхронное программирование, управляемое событиями», когда это возможно "для вменяемого определения" по возможности ".

Очевидно, не заменяйте все вызовы методов между вашими объектами сигналами и слотами. А когда вы используете сигналы и слоты, не всегда делайте их асинхронными (в очереди) - иногда вы хотите, чтобы объекты, подписанные на ваши сигналы, заканчивали sh их «реакции» на ваши сигналы до того, как функция излучения продолжится.

В общем, когда вас не волнует, будут ли подписчики ваших сигналов вызываться немедленно или позже, просто подключите их без указания типа соединения, и Qt будет использовать Auto Connection, что будет правильно вещь (по ниткам). Если вам не все равно, просто укажите тип соединения, которое вы хотите.

Если вы поначалу смущены этим, разумным может быть сделать все соединения по умолчанию в очереди - вы не будете обратите внимание на разницу в производительности, и это может помешать вам случайно написать код, который зависит от слотов, выполняющих «напрямую», если это не было вашим намерением.

Предложение в вашей ссылке в основном предназначено для любых событий, которые получают генерируется в вашем основном потоке, скорее всего, элементами пользовательского интерфейса - кнопками и т. д. c. Основная идея заключается в том, что вы хотите обрабатывать любые входные события как можно быстрее, чтобы основной поток оставался свободным для принятия любых более поздних событий и визуализации вашего пользовательского интерфейса, и, если события вызывают выполнение какой-либо значительной работы, переместите эту работу в другой поток, и ваш основной поток ожидает сигнала завершения, так что ваш основной поток остается "отзывчивым". Если вы хотите, чтобы ваш пользовательский интерфейс мгновенно реагировал на любые события, например, путем запуска «загрузки счетчика» или отображения индикатора выполнения, вы, конечно, можете сделать это напрямую. Это, конечно, также относится к любым другим потокам, которые могут нуждаться в том, чтобы оставаться отзывчивыми и обрабатывать другие события, пока в фоновом режиме происходят большие вычисления.

...