Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/37: Рейтинг темы: голосов - 37, средняя оценка - 4.89
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533

Как вызываются слоты? Синхронно или асинхронно?

14.01.2012, 23:44. Показов 7654. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, товарищи!

Возник такой вопрос:
Например, у меня в файле есть 2 слота... Они будут вызываться всегда синхронно?
Т.е. выполнение одного слота не может прерваться при получении сигнала для другого?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.01.2012, 23:44
Ответы с готовыми решениями:

Синхронно или асинхронно?
Приветствую. Настроился я тут познать асинхронную работу с COM портом, но немного подумав задался вопросом: а оно надо, когда заказчик...

Mssql - как асинхронно узнать о добавлении или удалении записи
Уважаемые Гуру! Подскажите, как можно асинхронно узнать о факте добавления или удаления записи. Есть задача написать сервис , который...

Слоты материнки или память?
Мать AORUS Gaming 3, две плашки оперативки patriot viper 4 pv416G320C6K по 8 гб каждая. Работают в двухканальном режиме. Пару раз в...

10
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
14.01.2012, 23:49
они вызываются синхронно
1
44 / 44 / 2
Регистрация: 26.10.2009
Сообщений: 298
15.01.2012, 00:51
Цитата Сообщение от alex_x_x Посмотреть сообщение
они вызываются синхронно
По умолчанию. Вообще можно и асинхронно.
1
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
15.01.2012, 01:24  [ТС]
А если у меня есть поток, который асинхронно шлет сигналы другому потоку, то поток, получающий поток все равно вызывает слот синхронно (т.е. имеется какая-то очередь сигналов что-ли?)

Vertus, а как можно заставить их вызываться асинхронно?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
15.01.2012, 01:46
Haster, Vertus правильно сказал, что есть варианты - почитайте руководство
Qt::AutoConnection 0 (default) If the signal is emitted from a different thread than the receiving object, the signal is queued, behaving as Qt::QueuedConnection. Otherwise, the slot is invoked directly, behaving as Qt:irectConnection. The type of connection is determined when the signal is emitted.
Qt:irectConnection 1 The slot is invoked immediately, when the signal is emitted.
Qt::QueuedConnection 2 The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
Qt::BlockingQueuedConnection 4 Same as QueuedConnection, except the current thread blocks until the slot returns. This connection type should only be used where the emitter and receiver are in different threads. Note: Violating this rule can cause your application to deadlock.
Qt::UniqueConnection 0x80 Same as AutoConnection, but the connection is made only if it does not duplicate an existing connection. i.e., if the same signal is already connected to the same slot for the same pair of objects, then the connection will fail. This connection type was introduced in Qt 4.6.
Qt::AutoCompatConnection 3 The default type when Qt 3 support is enabled. Same as AutoConnection but will also cause warnings to be output in certain situations. See Compatibility Signals and Slots for further information.
сложно понять, что вы хотите, но если вы хотите асинхронных сигналов (те, чтобы emit signal не дожидался когда соответствующий слот будет обработан и вернет управление), то эти опции не помогут.

Добавлено через 14 минут
реальная асинхронность как я понимаю без велосипедов бывает только с invokeMethod
1
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
15.01.2012, 11:48  [ТС]
alex_x_x, спасибо за ответ. В принципе, я просто хотел убедиться, что мне не нужно будет городить различные мьютексы.
А по поводу асинхронности, то просто интересно, как это добиться, вдруг в будущем пригодится.

Руководство почитаю, еще раз спасибо
0
44 / 44 / 2
Регистрация: 26.10.2009
Сообщений: 298
15.01.2012, 12:07
Цитата Сообщение от Haster Посмотреть сообщение
alex_x_x, спасибо за ответ. В принципе, я просто хотел убедиться, что мне не нужно будет городить различные мьютексы.
А по поводу асинхронности, то просто интересно, как это добиться, вдруг в будущем пригодится.

Руководство почитаю, еще раз спасибо
Из потоков сигналы автоматом будут асинхронными. Т.е. соединяться с Qt::QueuedConnection. Хотя у меня был один случай когда нужно было специально сказать чтобы соединялось асинхронно из потоков. Но тогда потоки были не Qt-шные, и сигнал слался из функции которая в Run-Time забиралась на исполнение в поток.

Добавлено через 2 минуты
Цитата Сообщение от alex_x_x Посмотреть сообщение
сложно понять, что вы хотите, но если вы хотите асинхронных сигналов (те, чтобы emit signal не дожидался когда соответствующий слот будет обработан и вернет управление), то эти опции не помогут.
Нет, с Qt::QueuedConnection как раз сигнал не дожидаеться слота. Этот сигнал ставиться в очередь на оработку объекту которому пришел сигнал. Когда до объекта дойдет очередь обработки событий, то только в этот момент будет обработка сигнала.
1
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
15.01.2012, 13:25  [ТС]
Vertus, Т.е. я правильно понял, что если сигналы сыпятся асинхронно из нескольких потоков, а слот установлен один, то слоты будут вызываться все равно синхронно, т.к. асинхронные сигналы попадают в очередь и извлекаются уже в порядке обработки слотами?
0
44 / 44 / 2
Регистрация: 26.10.2009
Сообщений: 298
15.01.2012, 13:38
Цитата Сообщение от Haster Посмотреть сообщение
Vertus, Т.е. я правильно понял, что если сигналы сыпятся асинхронно из нескольких потоков, а слот установлен один, то слоты будут вызываться все равно синхронно, т.к. асинхронные сигналы попадают в очередь и извлекаются уже в порядке обработки слотами?
Нет, не правильно. Сигналы из потоков не будут ждать выполнения слотов.

Вот тебе пример:

C++
1
2
3
4
5
6
7
8
9
10
11
//функция в которой имитируется сигнал.
 
void emitSignal()
{
 
   // код до сигнала
   // ....
  emit signal();
  // код после сигнала
  // ...
}
При синхронном подключении код после сигнала не выполниться до тех пор, пока не выполняться все слоты подписанные на этот сигнал.
При асинхронном подключении код после сигнала выполниться сразу после сигнала, не дожидаясь завершения выполнения подписанных слотов. Соответственно слоты выполняться когда дойдет очередь до объектов их содержащих в цикле событий qt приложения.
1
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
15.01.2012, 13:47  [ТС]
Vertus, меня на данном этапе больше интересует именно поведение слотов.
Для примера:
В 1 потоке эмитируется сигнал, который связан со слотом во втором потоке
Во 2 потоке тоже эмитируется сигнал, связанный с этим же слотом.
Вопрос: нужно ли в слоте ставить критические секции, или же слоты всегда будут вызываться последовательно и получение второго сигнала не может прервать выполнения первого слота?

Я правильно понял, что сигналы попадают в очередь, потом эта очередь просматривается и последовательно для сигналов вызываются слоты?
P.S. Наверно, сначала не правильно сформулировал вопрос, извиняюсь )
0
44 / 44 / 2
Регистрация: 26.10.2009
Сообщений: 298
15.01.2012, 13:53
Цитата Сообщение от Haster Посмотреть сообщение
Vertus, меня на данном этапе больше интересует именно поведение слотов.
Для примера:
В 1 потоке эмитируется сигнал, который связан со слотом во втором потоке
Во 2 потоке тоже эмитируется сигнал, связанный с этим же слотом.
Вопрос: нужно ли в слоте ставить критические секции, или же слоты всегда будут вызываться последовательно и получение второго сигнала не может прервать выполнения первого слота?

Я правильно понял, что сигналы попадают в очередь, потом эта очередь просматривается и последовательно для сигналов вызываются слоты?
P.S. Наверно, сначала не правильно сформулировал вопрос, извиняюсь )
Никаких критических секций в слоте не нужно, они будут вызываться последовательно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2012, 13:53
Помогаю со студенческими работами здесь

Слоты или новые планки
Железо: Мамочка: ASUS P4P800; CPU: Intel Celeron 3GHz; Видео: nVidia GeForce 5500; ОЗУ: DDR-400 1Gb; BIOS: AMI 2.51; ...

Что лучше слоты или события?
Так и не понил, зачем придумали эти СЛОТЫ. Во всех остальных библиотеках используется понятие СОБЫТИЕ - всё чётко и понятно. А слоты...

Слоты памяти или материнская плата
Посоветуйте пож.В чём может быть проблема.Раньше память стояла в 1 и 3 слотах.Лет 5 работала,сейчас начались вот эти вещи(крах...

Как вызываются модальные диалоговые окна
Что делает следующий фрагмент программы: private void button3_Click(object sender, EventArgs e) { Form3 f3 = new Form3(); ...

Как синхронно прокручивать два скроллбокса?
Можно ли отловить какое-то событие прокручивания TScrollBox?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru