Комментарии 12
Довольно громкий заголовок для достаточно повседневной статьи. То что концепция сигналов/слотов работает асинхронно знают все кто писал программы немножко сложнее чем Hello World, а то что вы называете асинхронной является самой обычной функцией, я уж не говорю про введенный вами термин «асинхронный класс».
То что концепция сигналов/слотов работает асинхронно знают все кто писал программы немножко сложнее чем Hello World
Она может работать асинхронно, а может и нет. Посмотрите параметр QueuedConnection. Если в цепочке коннектов его нигде не будет выставлено, то емит сигнала будет сводиться к вызову слотов как функций в месте эмита, а значит никакой асинхронности.
а то что вы называете асинхронной является самой обычной функцией
Как же её еще назвать если результат работы приходит позже её вызова?
я уж не говорю про введенный вами термин «асинхронный класс»
Ок, асинхронный класс — класс в котором есть асинхронные методы.
Если в цепочке коннектов его нигде не будет выставлено, то емит сигнала будет сводиться к вызову слотов как функций в месте эмита, а значит никакой асинхронности.Вы не правы. Объекты созданные в разных потоках (или перемещенные в разные потоки), будут по-умолчанию связаны «асинхронно» с параметром QueuedConnection.
Qt::AutoConnection (Default)
If the receiver lives in the thread that emits the signal, Qt::DirectConnection is used. Otherwise, Qt::QueuedConnection is used. The connection type is determined when the signal is emitted.
Как же её еще назвать если результат работы приходит позже её вызова?Вообще-то она возвращает результат типа void сразу по-завершении.
Я конечно прекрасно понимаю о чем вы пишите, но термин «асинхронная функция» не очень удачен.
самое то смешное — тут как раз везде директ
Нет, потому что внутри QNetworkAccessManager создается отдельный поток для работы с сокетами и он как раз эмитит сиггналы с флагом Qt::QueuedConnection. Все остальные сигналы подсоединяются как DirectConnection.
Интерфейс может быть асинхронным и без флага Qt::QueuedConnection. Приведу пример:
Если стоит флаг Qt::DirectConnection, то все слоты отработают до выхода из функции. Если стоит флаг (явно или нет) Qt::QueuedConnectio, то все слоты отработают после выхода из функции. Если же сигнал емитится не внутри функции, а где-то в логике программы после выхода из функции, то и с флагом Qt::DirectConnection получаем асинхронную функцию (пока лучше названия не придумал).
void function() {
emit signal();
}
Если стоит флаг Qt::DirectConnection, то все слоты отработают до выхода из функции. Если стоит флаг (явно или нет) Qt::QueuedConnectio, то все слоты отработают после выхода из функции. Если же сигнал емитится не внутри функции, а где-то в логике программы после выхода из функции, то и с флагом Qt::DirectConnection получаем асинхронную функцию (пока лучше названия не придумал).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Реализация и тестирование Qt C++ клиента сетевого сервиса с асинхронным интерфейсом на примере Yandex Dictionary Api