Frage

Ich versuche zu verwenden QDBusPendingCallWatcher einen asynchronen Anruf ansehen. Einige Beispielcode wie dieses:

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

und Handlerfunktion:

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

Meine Fragen sind:

  1. Es sieht aus wie QDBusPendingCallWatcher Verwendet freigegebener Datenzeiger innen, ist es sicher, das nicht manuell zu löschen watcher Zeiger? Lassen Sie einfach den Geltungsbereich verlassen und vergessen Sie es?

  2. Wenn ich den intelligenten Zeiger von PendingCall alle Tricks tun lassen kann, kann ich nur eins verwenden QDBusPendingCallWatcher Zeiger in meiner Klasse, um alle Async-Anrufe anzusehen? So was:

    {
        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*)));
    }
    

    Wird das eine Katastrophe machen? Oder sollte ich für jeden Anruf mehrere Zeiger verwenden?

Danke!

War es hilfreich?

Lösung

Schauen Sie sich die QdbuspendingCallwatcher-Dokumentation.:

Der mit dem oben genannten Code angeschlossene Steckplatz könnte dem folgenden ähnlich sein:

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();
}

Der ruf von Qobject :: deletelater. ist der Schlüssel: Dies bedeutet, dass QT das Objekt löscht, sobald die Ausführung in die Ereignisschleife zurückkehrt.

Solange Sie anrufen deleteLater Innerhalb Client::handler(...), Sie müssen nicht - genauer Ihnen nicht mehr anrufen delete watcher; irgendwo. Das einzige, was Sie sicherstellen müssen, ist, dass niemand das Objekt hinter sich verwendet call Nach dem Renditen des Schlitzes.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top