D-Bus アダプタでのスロットの宣言

D-Busアダプタのスロットは通常のパブリック・スロットと同様に宣言されますが、そのパラメータは特定のルールに従わなければなりません(詳細は Qt D-Bus Type Systemを参照してください)。パラメータがこれらの規則に従わないスロットやパブリックでないスロットは、D-Bus経由でアクセスすることはできません。

スロットは、const QDBusMessage & 型のパラメーターを1つ持つことができる。このパラメー ターは、入力パラメーター・リストの最後、出力パラメーターの前になければな らない。このパラメータがある場合、現在処理されているメッセー ジのコピーで初期化される。これにより、着呼側は、コネクション名な ど、着呼側に関する情報を得ることができる。

スロットには3種類ある:

  1. 非同期
  2. 入力専用
  3. 入出力

非同期スロット

非同期スロットは、通常呼び出し元に対して何も返さないスロットである。そのため、出力パラメータを取ることはできません。ほとんどの場合、スロットの最初の行が実行される頃には、呼び出し元の関数はすでに動作を再開しています。

しかし、スロットはその動作に頼ってはならない。スケジューリングやメッセージ・ディスパッチの問題によって、スロットの実行順序が変わってしまう可能性があるからだ。呼び出し元と同期するつもりのコードは、独自の同期方法を提供しなければならない。

非同期スロットは、メソッドのシグネチャで、void 戻り値の型とスロット名の前に、Q_NOREPLY というキーワードでマークされる。D-Bus Complex Ping Pongの例のquit() スロットがこの例である。

入力専用スロット

入力専用スロットは、値または定数参照で渡されるパラメータを受け取る通常のスロットです。しかし、非同期スロットとは異なり、呼び出し側は通常、処理を再開する前に呼び出し側の完了を待ちます。従って、非同期スロットはブロックすべきではないか、ブロックする可能性があることを文書で明示すべきである。

入力専用スロットは、値か定数参照で渡されるパラメータだけを受け取ることを除けば、シグネチャに特別なマークはありません。オプションとして、スロットは最後のパラメータとしてQDBusMessage 。このパラメータは、メソッド呼び出しメッセージの追加的な解析を行うために使用できます。

入出力スロット

入出力スロットは、入力のみのスロットと同様に、呼び出し側が応答を待っているスロットです。しかし、入力のみのスロットとは異なり、この応答にはデータが含まれます。データを出力するスロットは、定数でない参照を含むことができ、同様に値を返すことができる。ただし、出力パラメータはすべて引数リストの最後になければならず、入力引数を挟むことはできない。オプションとして、入力引数と出力引数の間にQDBusMessage

自動返信

メソッドの返事は、Qt D-Bus の実装によって、出力パラメータの内容(もしあれば)とともに自動的に生成される。スロットは、適切なQDBusMessage オブジェクトを構築し、接続を介して送信することを心配する必要はありません。

しかし、その可能性は残されている。スロットが特別なリプライやエラーを送信する必要があると判断した場合、QDBusMessage パラメータにQDBusMessage::createReply() またはQDBusMessage::createErrorReply() を使用し、それをQDBusConnection::send() で送信することで、それを行うことができる。Qt D-Bus の実装では、スロットがそのようにした場合、リプライは生成されません。

警告 呼び出し元がメソッドコールを置き、応答を待つとき、それは限られた時間しか待たない。完了までに長い時間がかかることを意図しているスロットは、呼び出し元がより高いタイムアウトを適切に設定できるように、ドキュメントでその事実を明確にする必要があります。

返信の遅延

状況によっては、呼び出されたスロットはリクエストをすぐに処理できないかも しれない。これは、リクエストにI/Oやネットワーク操作が含まれ、それがブロックされる可能性がある場合によくある。

このような場合、スロットはアプリケーションのメインループに制御を戻し、 ユーザーインターフェースのフリーズを回避し、後で処理を再開する必要があります。そのためには、入力パラメータリストの最後にある余分な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();

    appendRequest(data);
    return QString();
}

この場合、戻り値は重要ではない。コンパイラを満足させるために、任意の値を返す。

リクエストが処理され、リプライが可能になったら、取得した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 によって無視される。これらは、リモートアプリケーションにアダプタの説明を伝えるときに、 スロットのシグネチャを決定するためにのみ使用されます。

遅延リプライ自体は、元のメッセージに対して QDBusMessage::reply() を呼び出すことでQt D-Bus から要求される。その後、最終的に呼び出し元に応答を送信するのは、呼び出されたコードの責任となります。

警告 呼び出し元がメソッド呼び出しを行い、返事を待つ場合、限られた時間しか待ちません。完了までに長い時間がかかることを意図しているスロットは、呼び出し元がより高いタイムアウトを適切に設定できるように、ドキュメントでその事実を明確にする必要があります。

Qt D-Bus アダプターの使用法D-Bus アダプターのシグナルの宣言 Qt D-Bus タイプシステムQDBusConnectionQDBusMessageも参照のこと

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.