Класс, основанный на 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 который действует на это событие и выполняет вызов.

Другие вопросы по тегам