Мне забавно, что это многопоточная среда.
Если вы ограничены системой сигналов / слотов Qt между тем, ответьте на ваши конкретные вопросы:
1) это определенно не тот путь. При выделении из Emitter
общее число событий, равное количеству Receivers
, будет поставлено в очередь для циклов событий потока (ов) устройств, тогда такое же количество вызовов слотов произойдет, как только поток (ы) ) достичь тех событий. Даже если большинство из них потеряли всего if(id!=m_id) return;
на своей первой строке, в ядре Qt происходит значительное количество вещей. Поместите точку останова в один из ваших слотов, которая вызывается сигналом Qt::QueuedConnection
, и проверьте это, глядя на фактическую трассировку стека. Обычно от глубины xyEventLoop::processEvents(...)
по крайней мере 4 колла, поэтому «просто возвращение» определенно не «бесплатно» с точки зрения времени.
2) Не уверен, какова на самом деле внутренняя реализация Qt, но из того, что я знаю, подключение и отключение, скорее всего, включают вставку и удаление отправителя и получателя в некоторые списки, к которым, скорее всего, доступ осуществляется с помощью блокировки QMutex
. - может также быть «дорогим» по времени, и быстрое подключение и отключение определенно не лучшая практика.
3) Пожалуй, самое дешевое по времени решение, которое вы можете найти, все еще использующее систему синг-слотов Qt.
опционально) Взгляните на QSignalMapper
. Он предназначен именно для того, что вы планировали сделать в варианте 1).
Существуют более оптимальные решения для связи между вашими Emitter
и Receivers
, но в качестве лучшей практики я бы сначала выбрал вариант, который наиболее прост в использовании и быстр в реализации, но при этом имеет шанс быть быстрым достаточно времени выполнения (это вариант 3). ). Затем, когда это будет сделано, посмотрите, соответствует ли оно вашим требованиям к производительности. Если это не так и только тогда, рассмотрите возможность использования совместно используемой памяти с мьютексами в поставщике данных - архитектура потребителя данных (поток Emitter
быстро публикует данные запроса в циклическом списке, в то время как поток (потоки) Receiver
читает их всякий раз, когда время, затем отправляйте результаты обратно аналогичным образом, в то время как поток Emitter
постоянно опрашивает готовые результаты.)