كيفية استخدام qdbuspeningcallwatcher بشكل صحيح؟

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

  •  07-03-2022
  •  | 
  •  

سؤال

أحاول استخدام QDBusPendingCallWatcher لمشاهدة مكالمة ASYNC. بعض رمز عينة مثل هذا:

{
    // 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. إذا استطعت السماح للمؤشر الذكي باللقاء للقيام بكل الحيل، هل يمكنني استخدام واحدة فقط 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*)));
    }
    

    هل هذا يجعل كارثة؟ أو يجب علي استخدام مؤشرات متعددة لكل مكالمة؟

شكرا!

هل كانت مفيدة؟

المحلول

نلقي نظرة فاحصة QDBUSPINTeningcallwatcher الوثائق:

قد تكون الفتحة المتصلة بها بواسطة الرمز أعلاه شيء مشابه لما يلي:

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