Класс, основанный на QObject, имеет соединение с очередями
Я копался в некотором исходном коде, над которым я работаю. Я нашел своеобразное утверждение, которое кто-то закодировал. Исходный код представляет собой приложение с графическим интерфейсом QML GUI и использует QT 4.7.x.
Приведенный ниже фрагмент относится к основной логике приложения.
// connect signal-slots for decoupling
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this,
SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection);
Странно, что объект соединяется с собой через соединение в очереди, что по сути означает, что объект может "жить" в разных потоках одновременно?
На первый взгляд это не имело никакого смысла для меня. Может ли кто-нибудь придумать причину, по которой такая связь была бы правдоподобной или необходимой? Будет ли это даже работать?
2 ответа
Это будет работать без проблем. Может быть, перед вызовом SetCurrentTaskSlot требуется некоторая обработка цикла событий?
Обратите внимание, что QueuedConnection не означает, что что-то находится в другом потоке. QueuedConnection означает только то, что когда излучается сигнал, соответствующий слот не будет вызываться напрямую. Он будет поставлен в очередь в цикле событий и будет обработан, когда управление будет возвращено в цикл событий.
Соединение в очереди ничего не говорит о том, где живет получатель. Верно обратное: чтобы безопасно отправлять сигналы объекту, живущему в другом потоке, вы должны использовать соединения в очереди. Но вы можете использовать их для объекта, живущего в любой теме!
Один использует соединение с очередями, чтобы гарантировать, что сигнал будет доставлен из цикла событий, а не сразу из узла передачи, как это происходит с прямым соединением. Концептуально прямое соединение - это набор вызовов указателей на функции в списке. Очередное соединение - это концептуально событие, отправляемое умному получателю, который может выполнить вызов функции в зависимости от содержимого события.
Событие является внутренним QMetaCallEvent
, и это QObject::event
который действует на это событие и выполняет вызов.