D-Bus 어댑터의 슬롯 선언하기
D-Bus 어댑터의 슬롯은 일반 공용 슬롯과 마찬가지로 선언되지만 해당 매개변수는 특정 규칙을 따라야 합니다(자세한 내용은 Qt D-Bus 유형 시스템 참조). 매개변수가 이러한 규칙을 따르지 않거나 공용이 아닌 슬롯은 D-Bus를 통해 액세스할 수 없습니다.
슬롯에는 const QDBusMessage &
유형의 매개변수가 하나 있을 수 있으며, 이 매개변수는 입력 매개변수 목록의 마지막에 출력 매개변수보다 먼저 나타나야 합니다. 이 매개변수가 있는 경우 현재 처리 중인 메시지의 복사본으로 초기화되어 발신자가 연결 이름 등 발신자에 대한 정보를 얻을 수 있습니다.
슬롯은 세 가지 종류가 있습니다:
- 비동기
- 입력 전용
- 입력 및 출력
비동기 슬롯
비동기 슬롯은 일반적으로 호출자에게 어떠한 응답도 반환하지 않는 슬롯입니다. 따라서 어떤 출력 매개변수도 받을 수 없습니다. 대부분의 경우, 슬롯의 첫 번째 줄이 실행될 때쯤이면 호출자 함수는 이미 작동을 재개한 상태입니다.
그러나 슬롯은 이러한 동작에 의존해서는 안 됩니다. 스케줄링 및 메시지 발송 문제로 인해 슬롯이 실행되는 순서가 변경될 수 있습니다. 호출자와 동기화하려는 코드는 자체 동기화 방법을 제공해야 합니다.
비동기 슬롯은 메서드 서명에서 void
반환 유형과 슬롯 이름 앞에 Q_NOREPLY 키워드로 표시됩니다. D-Bus 복합 탁구 예제의 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 을참조하세요 .
© 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.