Pregunta

Estoy tratando de usar QDBusPendingCallWatcher para ver una llamada de ASYNC. Algún código de muestra como este:

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

y función del manejador:

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

Mis preguntas son:

  1. Parece que QDBusPendingCallWatcher usos Puntero de datos compartidos dentro, ¿es seguro no eliminar manualmente el watcher ¿puntero? ¿Solo deja el alcance y olvídalo?

  2. Si puedo dejar que el Smart Pointer of Pendingcall haga todos los trucos, ¿puedo usar solo uno QDBusPendingCallWatcher ¿Puntero en mi clase para ver todas las llamadas de ASYNC? Me gusta esto:

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

    ¿Esto hace un desastre? ¿O debo usar múltiples punteros para cada llamada?

¡Gracias!

¿Fue útil?

Solución

Echar un vistazo más de cerca a la Documentación de WhuspingingCallwatcher:

La ranura conectada a por el código anterior podría ser algo similar a lo siguiente:

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

La llamada de QOBJECT :: Deletelater es la clave: Esto significa que QT eliminará el objeto tan pronto como la ejecución vuelva al ciclo de eventos.

Mientras llame deleteLater en el interior Client::handler(...), no necesitas, más precisamente, tú, MUS NO - Llamada delete watcher; en cualquier sitio. Lo único que tiene que asegurarse es que nadie usa el objeto detrás. call Después de que la ranura regresa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top