Я бы начал с вашего второго вопроса , чтобы сказать, что ваш мысленный образ частично верен, потому что очередь включена, но не всегда.Когда излучается сигнал, существует три возможных способа вызова подключенного слота (-ов), и два из них используют очередь событий (QMetaCallEvent
создается на лету и отправляется с помощью метода QCoreApplication
postEvent
,где целью события является держатель слота или приемник сигнала, если вы предпочитаете).Третий случай - это прямой вызов, поэтому излучение сигнала похоже на вызов слота, и ничего не ставится в очередь.
Теперь к первому вопросу : в любом случае, когда излучается сигнал, просматривается список соединений (принадлежащих источнику сигнала), и слоты вызываются одно за другим, используяодин из трех методов, указанных выше.Всякий раз, когда соединение установлено или разорвано, список будет обновляться, но это обязательно произойдет до или после передачи сигнала.Короче говоря: очень мало шансов преуспеть в блокировании вызова в подключенный слот после того, как сигнал был испущен, по крайней мере, не разрывая соединение с disconnect()
.Поэтому я бы пометил [OPTION 3]
как правильный.
Если вы хотите копать дальше, начните с документации перечисления ConnectionType , где три основных типа соединения (прямое, поставленное в очередь и блокирующее -в очереди) хорошо объяснили. тип соединения может быть указан в качестве пятого аргумента для метода QObject
connect
, но, как вы узнаете из вышеупомянутых связанных документов, очень часто Qt сам выбирает тип соединенияэто лучше всего соответствует ситуации.Спойлер: темы участвуют:)
О третьем вопросе : У меня нет под рукой тестов, поэтому я дам так называемое в основном основанное на мнении ответ, вид ответа, который начинается с ИМХО.Я думаю, что сфера сигнал / слот является одной из тех, в которых правила keep-it-simple действительно действуют, и ваш шаблон reconnect , кажется, делает многоесложнее, чем они должны быть.Как я уже упоминал выше, когда соединение установлено, объект соединения добавляется в список.Когда сигнал испускается, все подключенные слоты будут вызываться так или иначе, один за другим.Итак, вместо отключения / повторного подключения / генерации на каждом цикле в вашем цикле, почему бы просто не сначала подключить все элементы, а затем подать сигнал, а затем отключить их все?
Надеюсь, мой (длинный и, может быть, tldr) ответ помог.Приятного чтения.