Ответ 1
Вы не увидите большой разницы, если не работаете с объектами, имеющими разные сходства нитей. Скажем, у вас есть QObjects A
и B
, и они оба прикреплены к различным потокам. A
имеет сигнал с именем somethingChanged()
и B
имеет слот под названием handleChange()
.
Если вы используете прямое соединение
connect( A, SIGNAL(somethingChanged()), B, SLOT(handleChange()), Qt::DirectConnection );
метод handleChange()
будет фактически выполняться в потоке A
. В принципе, он как бы излучает сигнал, вызывает метод "прямо". Если B::handleChange()
не является потокобезопасным, это может вызвать некоторые (трудные для поиска) ошибки. По крайней мере, вы упускаете преимущества дополнительного потока.
Если вы измените метод подключения на Qt::QueuedConnection
(или, в этом случае, пусть Qt решит, какой метод использовать), все становится интереснее. Предполагая, что поток B
запускает цикл событий, излучение сигнала отправляет событие в цикл событий B
. Цикл событий останавливает событие и в конечном итоге вызывает метод слота всякий раз, когда управление возвращается к нему (это цикл события). Это делает довольно простой способ связи между/между потоками в Qt (опять же, если ваши потоки запускают собственные локальные циклы событий). Вам не нужно беспокоиться о блокировках и т.д., Потому что цикл событий сериализует вызовы слота.
Примечание. Если вы не знаете, как изменить аффинность потока QObject, загляните в QObject::moveToThread
. Это должно заставить вас начать.
Edit
Я должен уточнить свое вступительное предложение. Это имеет значение, если вы указываете соединение в очереди - даже для двух объектов в одном потоке. Событие по-прежнему отправляется в цикл событий потока. Таким образом, вызов метода по-прежнему является асинхронным, то есть он может задерживаться непредсказуемыми способами (в зависимости от любых других событий, которые цикл может потребовать для обработки). Однако, если вы не указали метод подключения, прямой метод автоматически используется для соединений между объектами в одном и том же потоке (по крайней мере, в Qt 4.8).