Как стать автором
Обновить

Комментарии 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.
Дабы никто не был введен в заблуждение, в QNetworkAccessManager никаких потоков дополнительно не создается. Даже специально проверил имплементацию в Qt5. Сокеты poll'ятся в мэйнтреде.
QNetworkReply создается в треде, который в котором был вызван get/post/put и т.п.
Интерфейс может быть асинхронным и без флага Qt::QueuedConnection. Приведу пример:
void function() {
    emit signal();
}

Если стоит флаг Qt::DirectConnection, то все слоты отработают до выхода из функции. Если стоит флаг (явно или нет) Qt::QueuedConnectio, то все слоты отработают после выхода из функции. Если же сигнал емитится не внутри функции, а где-то в логике программы после выхода из функции, то и с флагом Qt::DirectConnection получаем асинхронную функцию (пока лучше названия не придумал).
пожалуйста, не надо придумывать такие названия. Оно не соответствует действительности. Есть асинхронные вызовы.
Ага, спасибо, асинхронные вызовы тогда.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории