С++ Qt. Когда вызывается слот, вызывается ли функция новым потоком?

Я хотел бы знать, обрабатывается ли функция do_something() как новый поток, когда я нажимаю my_button.

connect(my_button, SIGNAL(clicked), this, SLOT(do_something));

person Béatrice Moissinac    schedule 20.08.2012    source источник


Ответы (1)


Типичное поведение сигнала/слота определяется на основе типа соединения. Если он не указан, по умолчанию он равен Qt::AutoConnection и будет использовать поток получателя, если прямое соединение установить невозможно.

Из документов:

Слот вызывается, когда управление возвращается в цикл обработки событий потока получателя. Слот выполняется в потоке получателя.

Вы можете изменить тип подключения во время подключения, чтобы изменить поведение:

connect(my_button, SIGNAL(clicked), this, SLOT(do_something),
    Qt::QueuedConnection); // always queue

Поскольку вы говорите о кнопке, которая излучает сигнал, тип соединения по умолчанию Qt::AutoConnection подразумевает, что установлено прямое соединение и что слот do_something будет выполняться немедленно, как если бы он был вызван непосредственно в момент нажатия кнопки.

person Kaleb Pederson    schedule 20.08.2012
comment
Я понятия не имел, что Qt управляет типом соединения. Я читаю документацию, но что-то не ясно: (по умолчанию) Если сигнал испускается из другого потока, чем принимающий объект. Не могли бы вы определить из другой темы? Точнее, я знаю, что и как работает многопоточность. Я не знаю, как Qt управляет своими вещами, и я предполагаю, что существует скрытая система потоков. - person Béatrice Moissinac; 20.08.2012
comment
@Bibi541: Никаких скрытых потоков, но если вы создаете свои собственные QThread, они могут иметь свои собственные циклы событий, а QObjects, назначенные/созданные для этих потоков, будут иметь слоты автосоединения, вызываемые в их потоке, а не в потоке исходящего объекта (обычно основной/ цикл пользовательского интерфейса для QButtons и т.п....) - person Macke; 20.08.2012
comment
Некоторые примечания: Направленное соединение — это просто вызов функции с некоторым промежуточным поиском соединения и полностью синхронным. Соединение в очереди (без сознательного перемещения объектов в разные потоки) планирует вызов в цикле событий, но это все еще однопоточный. - person Frank Osterfeld; 20.08.2012
comment
В общем, слот никогда не вызывается в новом потоке. Даже если поток получателя отличается от потока отправителя, это может быть только потому, что вы сами создали этот поток и создали объект-получатель в этом потоке. Qt не создает никаких новых потоков под капотом. - person Christian Rau; 20.08.2012