Как использовать QDbuspendingCallwatcher должным образом?

StackOverflow https://stackoverflow.com/questions/14726469

  •  07-03-2022
  •  | 
  •  

Вопрос

Я пытаюсь использовать QDBusPendingCallWatcher смотреть на асинхронный звонок. Некоторый пример код, как это:

{
    // interface = new QDBusInterface(...);
    QDBusPendingCall pcall = interface->asyncCall("query");
    QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pcall, this);
    QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(handler(QDBusPendingCallWatcher*)));
}

И функция обработчика:

void Client::handler(QDBusPendingCallWatcher* call)
{       
    QDBusPendingReply<QString> reply = *call; 
    // do something
}

Мои вопросы:

  1. Это выглядит как QDBusPendingCallWatcher использует Общий указатель данных внутри, это безопасно, чтобы не вручную удалить watcher указатель? Просто оставьте область и забудьте об этом?

  2. Если я могу позволить умному указателю PendesdCall делать все трюки, могу ли я использовать только один QDBusPendingCallWatcher Указатель в моем классе, чтобы посмотреть все вызовы Async? Так:

    {
        QDBusPendingCall pcall = interface->asyncCall("query");
        watcher = new QDBusPendingCallWatcher(pcall, this);
        QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(handleOne(QDBusPendingCallWatcher*)));
    
        pcall = interface->asyncCall("anotherQuery");
        watcher = new QDBusPendingCallWatcher(pcall, this);
        QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(handleTwo(QDBusPendingCallWatcher*)));
    }
    

    Будет ли это производит катастрофу? Или я должен использовать несколько указателей для каждого вызова?

Спасибо!

Это было полезно?

Решение

Посмотрите на QdbuspendingCallwatcher Документация:

Слот, подключенный к вышеуказанному коду, может быть чем-то похожем на следующее:

void MyClass::callFinishedSlot(QDBusPendingCallWatcher *call)
{
    QDBusPendingReply<QString, QByteArray> reply = *call;
    if (reply.isError()) {
        showError();
    } else {
        QString text = reply.argumentAt<0>();
        QByteArray data = reply.argumentAt<1>();
        showReply(text, data);
    }
    call->deleteLater();
}

Зов Qobject :: Deletelater. Это ключ: это означает, что QT удалит объект, как только выполнение возвращается к контуру события.

До тех пор, пока вы звоните deleteLater внутри Client::handler(...), Вам не нужно - точнее ты не муже нет - звоните delete watcher; в любом месте. Единственное, что вы должны обеспечить, это то, что никто не использует объект позади call После возвращения слота.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top