Spec-Zone.ru › Qt 5.11

Объявление слотов в адаптерах D-Bus

Слоты в адаптерах D-Bus объявляются так же, как обычные публичные слоты, но их параметры должны соответствовать определенным правилам (см. Система типов Qt D-Bus для получения дополнительной информации). Слоты, параметры которых не соответствуют этим правилам или которые не являются публичными, не будут доступны через D-Bus.

Слоты могут иметь один параметр типа const QDBusMessage &, который должен находиться в конце списка входных параметров, перед любыми выходными параметрами. Этот параметр, если он присутствует, будет инициализирован копией текущего обрабатываемого сообщения, что позволяет вызываемому объекту получить информацию о вызывающем объекте, например, его имя подключения.

Слоты могут быть трех видов:

  1. Асинхронные
  2. Только входные
  3. Входные и выходные

Асинхронные слоты

Асинхронные слоты — это те, которые обычно не возвращают никакого ответа вызывающему объекту. По этой причине они не могут принимать выходные параметры. В большинстве случаев к моменту выполнения первой строки слота функция вызывающего объекта уже возобновила работу.

Однако слоты не должны полагаться на это поведение. Вопросы планирования и обработки сообщений могут изменить порядок выполнения слота. Код, предназначенный для синхронизации с вызывающим объектом, должен обеспечить свой собственный метод синхронизации.

Асинхронные слоты отмечаются ключевым словом Q_NOREPLY в сигнатуре метода, перед возвращаемым типом void и именем слота. Слоты quit() в примере D-Bus Complex Ping Pong Example являются примером этого.

Слоты только для ввода

Слоты только для ввода — это обычные слоты, которые принимают параметры, передаваемые по значению или по константной ссылке. Однако, в отличие от асинхронных слотов, вызывающий объект обычно ожидает завершения вызываемого объекта перед возобновлением работы. Поэтому неасинхронные слоты не должны блокировать или должны указывать в своей документации, что они могут это делать.

Слоты только для ввода не имеют специальных обозначений в своей сигнатуре, за исключением того, что они принимают только параметры, передаваемые по значению или по константной ссылке. Также слоты могут принимать параметр QDBusMessage в качестве последнего параметра, который может быть использован для дополнительного анализа сообщения вызова метода.

Слоты входа и выхода

Подобно слотам только для ввода, слоты входа и выхода — это слоты, для которых вызывающий объект ожидает ответ. Однако, в отличие от слотов только для ввода, этот ответ будет содержать данные. Слоты, которые выдают данные, могут содержать неконстантные ссылки и могут возвращать значение. Однако выходные параметры должны располагаться в конце списка аргументов и не могут иметь входные аргументы, перемеженные с ними. Также аргумент QDBusMessage может появиться между входными и выходными аргументами.

Автоматические ответы

Ответы на методы генерируются автоматически с содержимым выходных параметров (если они были) реализацией Qt D-Bus. Слотам не нужно беспокоиться о построении правильных объектов QDBusMessage и их отправке по подключению.

Однако возможность этого остается. Если слот обнаружит, что ему нужно отправить специальный ответ или даже ошибку, он может сделать это, используя QDBusMessage::createReply() или QDBusMessage::createErrorReply() на параметре QDBusMessage и отправить его с помощью QDBusConnection::send(). Реализация Qt D-Bus не будет генерировать ответ, если слот сделал это.

Предупреждение: Когда вызывающий объект помещает вызов метода и ожидает ответа, он будет ожидать только ограниченное количество времени. Слоты, предполагающие длительное выполнение, должны ясно указать этот факт в документации, чтобы вызывающие объекты правильно устанавливали более высокие таймауты.

Отложенные ответы

В некоторых ситуациях вызываемый слот может не быть в состоянии немедленно обработать запрос. Это часто случается, когда запрос включает в себя операцию ввода-вывода или сетевую операцию, которая может заблокировать.

В этом случае слот должен передать управление главному циклу приложения, чтобы избежать зависания пользовательского интерфейса, и возобновить процесс позже. Для достижения этой цели он должен использовать дополнительный параметр QDBusMessage в конце списка входных параметров и запросить отложенный ответ.

Мы делаем это, написав слот, который хранит данные запроса в персистентной структуре, указывая вызывающему объекту с помощью QDBusMessage::setDelayedReply(true), что ответ будет отправлен позже.

struct RequestData
{
    QString request;
    QString processedData;
    QDBusMessage reply;
};

QString processRequest(const QString &request, const QDBusMessage &message)
{
    RequestData *data = new RequestData;
    data->request = request;
    message.setDelayedReply(true);
    data->reply = message.createReply();
    QDBusConnection::sessionBus().send(data->reply);

    appendRequest(data);
    return QString();
}

Использование QDBusConnection::sessionBus().send(data->reply) необходимо для явного информирования вызывающего объекта о том, что ответ будет отложен. В этом случае возвращаемое значение не имеет значения; мы возвращаем произвольное значение, чтобы удовлетворить компилятор.

Когда запрос обработан и ответ доступен, он должен быть отправлен с помощью объекта QDBusMessage, который был получен. В нашем примере код ответа мог бы быть следующим:

void sendReply(RequestData *data)
{
    // data->processedData has been initialized with the request's reply
    QDBusMessage &reply = &data->reply;

    // send the reply over D-Bus:
    reply << data->processedData;
    QDBusConnection::sessionBus().send(reply);

    // dispose of the transaction data
    delete data;
}

Как видно из примера, когда отложенный ответ присутствует, возвращаемое значение(я) слота игнорируются Qt D-Bus. Они используются только для определения сигнатуры слота при передаче описания адаптера удаленным приложениям или в случае, если код в слоте решит не использовать отложенный ответ.

Сам отложенный ответ запрашивается у Qt D-Bus путем вызова QDBusMessage::reply() на исходном сообщении. Затем ответственность за отправку ответа вызывающему объекту ложится на вызываемый код.

Предупреждение: Когда вызывающий объект помещает вызов метода и ожидает ответа, он будет ожидать только ограниченное количество времени. Слоты, предполагающие длительное выполнение, должны ясно указать этот факт в документации, чтобы вызывающие объекты правильно устанавливали более высокие таймауты.

См. также Использование адаптеров Qt D-Bus, Объявление сигналов в адаптерах D-Bus, Система типов Qt D-Bus, QDBusConnection и QDBusMessage.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/qdbusdeclaringslots.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API