إشارات دفعة - كيف التحكم في العمر من الكائنات المرسلة إلى المشتركين؟ مؤشرات ذكية؟

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

سؤال

أنا أستخدم دفعة :: Signals2 تحت Ered Hat Enterprise Linux 5.3.

تقوم إشارة بإنشاء نسخ كائن ويرسل مؤشرها للمشتركين. تم تنفيذ ذلك لسلامة الخيط لمنع مؤشر ترابط العمال من تحديث خاصية السلسلة على الكائن في نفس الوقت يتم قراءته (ربما يجب علي إعادة النظر في استخدام الأقفال؟).

على أي حال، فإن اهتمامي هو مع مشتركي متعددين يقومون بإلغاء تحديد المؤشر إلى الكائن المنسوخ على خيطهم الخاص. كيف يمكنني التحكم في حياة الكائن؟ كيف يمكنني معرفة جميع المشتركين تتم مع الكائن وهو آمن لحذف الكائن؟

typedef boost::signals2::signal< void ( Parameter* ) > signalParameterChanged_t;
signalParameterChanged_t    m_signalParameterChanged;

// Worker Thread - Raises the signal
void Parameter::raiseParameterChangedSignal()
{
      Parameter* pParameterDeepCopied = new Parameter(*this);
      m_signalParameterChanged(pParameterDeepCopied);
}
// Read-Only Subscriber Thread(s) - GUI (and Event Logging thread ) handles signal
void ClientGui::onDeviceParameterChangedHandler( Parameter* pParameter)
{
      cout << pParameter->toString() << endl;
      delete pParameter;  // **** This only works for a single subscriber !!!
}

شكرا مقدما على أي نصائح أو اتجاه،

-

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

المحلول

إذا كان لديك حقا أن تمر Parameter بواسطة المؤشر إلى المشتركين الخاص بك، ثم يجب عليك استخدام boost::shared_ptr:

typedef boost::shared_ptr<Parameter> SharedParameterPtr;
typedef boost::signals2::signal< void ( SharedParameterPtr ) > signalParameterChanged_t;
signalParameterChanged_t    m_signalParameterChanged;

// The signal source
void Parameter::raiseParameterChangedSignal()
{
      SharedParameterPtr pParameterDeepCopied = new Parameter(*this);
      m_signalParameterChanged(pParameterDeepCopied);
}
// The subscriber's handler
void ClientGui::onDeviceParameterChangedHandler( SharedParameterPtr pParameter)
{
      cout << pParameter->toString() << endl;
}

سيتم حذف كائن المعلمة المشتركة المرسلة إلى المشتركين الخاص بك تلقائيا عندما يصبح عدد المرجع المرجعي صفر (أي أنه يخرج من النطاق في جميع المعالجين).

هي المعلمة حقا ثقيل جدا تحتاج إلى إرسالها إلى المشتركين الخاص بك عبر المؤشر؟

تعديل:

يرجى ملاحظة أن استخدام Shared_Ptr يعتني بإدارة مدى الحياة، ولكن لن يخفف من المسؤولية عن قراءة المزيد من القراءات / يكتب إلى / من مؤشر ترابط الكائنات المعلمة المشتركة. قد ترغب في الحصول على نسخ عبر نسخ إلى المشتركين لأسباب تتعلق بأسلوب الخيط وحدها. في سؤالك، ليس من الواضح بما يكفي بالنسبة لي ما الذي يحدث في الخيط، لذلك لا أستطيع أن أعطيك توصيات أكثر محددة.

هو استدعاء الخيط raiseParameterChangedSignal() نفس خيط واجهة المستخدم الرسومية الخاصة بك؟ لا تسمح بعض أدوات واجهة المستخدم الرسومية بالاستخدام المتزامن ل API الخاص بهم بواسطة مؤشرات ترابط متعددة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top