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

D-Busアダプタのスロットは通常のパブリック・スロットと同様に宣言されますが、パラメータは特定のルールに従わなければなりません(詳細はQt D-Bus型システムを参照してください)。パラメータがこれらの規則に従わないスロットやパブリックでないスロットは、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も参照してください

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。