이 페이지에서

D-Bus 어댑터에서 슬롯 선언하기

D-Bus 어댑터의 슬롯은 일반적인 공개 슬롯과 동일한 방식으로 선언되지만, 매개변수는 특정 규칙을 따라야 합니다(자세한 내용은 ‘ Qt D-Bus 유형 시스템’ 참조). 매개변수가 해당 규칙을 따르지 않거나 공개되지 않은 슬롯은 D-Bus를 통해 접근할 수 없습니다.

슬롯은 const QDBusMessage & 유형의 매개변수를 하나 가질 수 있으며, 이 매개변수는 입력 매개변수 목록의 맨 끝, 즉 모든 출력 매개변수보다 앞에 위치해야 합니다. 이 매개변수가 존재할 경우, 현재 처리 중인 메시지의 복사본으로 초기화되며, 이를 통해 호출받는 측은 호출자의 연결 이름과 같은 정보를 얻을 수 있습니다.

슬롯은 다음 세 가지 유형이 있습니다:

  1. 비동기
  2. 입력 전용
  3. 입력 및 출력

비동기 슬롯

비동기 슬롯은 일반적으로 호출자에게 아무런 응답도 반환하지 않는 슬롯입니다. 따라서 출력 매개변수를 받을 수 없습니다. 대부분의 경우, 슬롯의 첫 번째 줄이 실행될 때쯤이면 호출자 함수는 이미 작업을 재개한 상태입니다.

그러나 슬롯은 이러한 동작에 의존해서는 안 됩니다. 스케줄링 및 메시지 디스패치 문제로 인해 슬롯이 실행되는 순서가 바뀔 수 있습니다. 호출자와 동기화를 시도하는 코드는 자체적인 동기화 방법을 제공해야 합니다.

비동기 슬롯은 메서드 시그니처에서 ` Q_NOREPLY ` 키워드로 표시되며, 이 키워드는 ` void ` 반환 유형과 슬롯 이름 앞에 위치합니다. 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 타입 시스템, QDBusConnection 및 QDBusMessage.

© 2026 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.