• 0
miss y

Callback Vs Signalslot [مقارنة للنقاش]

سؤال

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

Callback vs SignalSlot

Inter-object Communication Mechanisms

الموضوع بكل بساطة هو مقارنة شاملة و تفصيلية(لو ممكن) حول آلية Signals And Slots في تقنية Qt و آلية Callback الموجودة في بعض التقنيات الرسومية العتيقة مثل Win32-API.

,.,.,.,.,.,.,.,.

ماذا يوجد في المصادر|الكُتب المتعلقة بتقنية Qt حوْل آلية SignalSlot و بعض المقارنات مع آلية callback المدعومة في بعض الورش و الإطارات الرسومية العتيقة مثل win32-API. بالطبع انا (كيوتيّة) مثقفة كيوتيّاً ولم يسبق لي دراسة Win32-API على الإطلاق ولا حتى اكاديمياً.

طبعاً كل المصادر تؤكد بأن آلية SignalSlots آمنة بيانياً Type-safe ولكن(يارب استر ما يزعلوا :happy: ) آلية callback ليست كذلك. الإقتباس التالي من مصدر Qt Assistant

Older toolkits achieve this kind of communication using callbacks. A callback is a pointer to a function, so if you want a processing function to notify you about some event you pass a pointer to another function (the callback) to the processing function. The processing function then calls the callback when appropriate. Callbacks have two fundamental flaws: Firstly, they are not type-safe. We can never be certain that the processing function will call the callback with the correct arguments. Secondly, the callback is strongly coupled to the processing function since the processing function must know which callback to call.

In Qt, we have an alternative to the callback technique: We use signals and slots.

.,.,,.,.,.,,.,.

الإقتباس التالي حوْل SignalSlot من كتاب Foundations of Qt Development

SIGNALS AND SLOTS UNDER THE HOOD

Signals and slots are implemented by Qt using function pointers. When calling emit with the signal as argument, you actually call the signal. The signal is a function implemented in the source file generated by the moc. This function calls any slots connected to the signal using the meta-objects of the objects holding the connected slots. The meta-objects contain function pointers to the slots, along with their names and argument types. They also contain a list of the available signals and their names and argument types. When calling connect,

you ask the meta-object to add the slot to the signal's calling list. If the arguments match, the connection is

made.

When matching arguments, the match is checked only for the arguments accepted by the slot. This

means that a slot that does not take any arguments matches all signals. The arguments not accepted by the

slot are simply dropped by the signal-emitting code.

عموماً انا عاملة الموضوع للنقاش الحُر حوْل الآليتين + حملة دعائية حول ثقافة Qt و قوة آليّاتها مقارنةً بآلية عتيقة ذائعة الصيت.

.,,.,..,,.,.

رمضان كريم

دمتم

:happy:

تم تعديل بواسطه رغَـد
signal = singal بالسوريانيّة
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

14 إجابة على هذا السؤال .

  • 0

شكرا اختنا العزيزة رغد

شرحك اكثر من رائع ... لكن اللى خلانى اسيب Qt انى اصلا مش فاهم يعنى ايه Signal و يعنى ايه Slot

وفقك الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
شكرا اختنا العزيزة رغد

شرحك اكثر من رائع ... لكن اللى خلانى اسيب Qt انى اصلا مش فاهم يعنى ايه Signal و يعنى ايه Slot

وفقك الله

عفواً اخي عمر:

انا متلك ولكن بالعكس...مالي فاهمة آلية callback كتير... ومش مضطرة لهيك خلص... :happy:

,.,.,.,.,.,.,.

بكل بساطة :

Signal And Slots mechanism هي آلية لربط الكائنات المرئية(الرسومية) والغير مرئية في البرنامج مع بعضها البعض...هذا الربط منطقي, بحيث إذا تغيرت حالة كائن ما مربوط بكائن آخر عن طريق هذه الآلية يقوم البرنامج بإرسال| اصدار الـ Signal الخاص بهذا الكائن ليستدعي الـ Slot الخاص بالكائن التاني(المربوط أو المتصل بهذا الكائن)...

الـ slot بكل بساطة هو دالة function عادي...بالتحديد هو Member function عادي خالص...يقوم بتنفيذ إجراء معين مكتوب بواسطتنا, متل الدوال العادية بالزبط...و لكن ممكن أن يُعامل معاملة الـ slot ايضاً

هذا المفهوم له مصطلح عام وهو:

Inter-object Communication

مش اكتر من هيك ابداً...والفكرة بسيطة بالمرة وبديهية

,.,.,.,.,.,.,.

:happy:

تم تعديل بواسطه اللؤْلؤة رغَـــد
حاذفة كلمة emit(مسببة تشتيت)
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

حقيقة المقارنة جميلة و موضوعية

لكن دعنا ننظر الى signal and slots اذا نظرت نظرة عميقة الى هذه الطريقة تجد انها مجرد تغليف للcallback.

نعم انها مجرد تغليف, فى الكول باك, يقوم المبرمج بتمرير مؤشر الى دالة, الشئ الذى قد يجلب المشاكل, ولكن من ناحية اخرى

يكون الموضوع فى غاية السرعة عند استخدام المؤشر مباشرة (هذا اذا استطعنا ان ننجو من الاخطاء). جل الاخظاء التى يمكن ان تنتج من

ال كول ياك تاتى من كون ان نوع الدالة لا يتم فحصه اثناء وقت التنفيذ. لذلك قد تحصل لخيطة فى الاستاك, خصوصا اذا كانت الدالة من المتوقع

ان تعيد كائن كبير لا يمكن حمله فى مسجل.

الان دعنا ننظر الى الاخرى signals and slots الشئ الجذاب هنا ان الموضوع لا يرتبط بدالة فقط ولكن فوق ذلك فهو يرتبط بكائن فى حد ذاته

من الوهلة الاولى يبدو و كأن وراء الامر سحرا, لكن اذا نظرت فى QT تجد لنك ملزم ان تكتب ماكرو على ما اظن Q_OBJECT فى مقدمة الكلاس.

لو امعنت النظر هنا, ما هذا الماكرو. هذا الماكرو يفك الى ما يعرف RTTI (Run-Time Type Information) , و فى العادة يتم هذا قبل عملية الترجمة

بواسطة ما يسمى فى QT ب moc (meta-object compiler) . ويتم استخدام القوالب Templates لعملبة الربط الديناميكية هذه.

الفكرة فى حد نفسها مذهلة, يمكن للواحد ان يرى كيف تعمل, فقط انظر للمفات التى تبدأ بالعبارة moc و انت تعرف القصة كلها و تعرف اصل ال Q_OBJECT

الان سترى ان هناك الكثير من الكود تمت اضافته اوتوماتيكيا بواسطة moc. الان لاحظ الى سرعة التنفيذ

فى النهاية الموضوع هو مشادة بين سلامة البرنامج و سرعة اليتفيذ

يبدو ان الاولى تفوذ فى عصر السرعة هذا.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ابداً مش تغليف ولا شيء...اقرأوا النص التالي (ناقلته حرفياً من المسودة الخاصة بـ Qt4 ... وهو حل Solution من اختراع المؤسسة المطورة لـ Qt:

GUI applications respond to user actions, For example, when a user clicks a menu item or a toolbar button, the application executes some code. More generally, we want objects of any kind to be able to communicate with each other. The programmer must relate events to the relevant code. Older toolkits use mechanisms that are not type-safe (i.e. they are crash-prone), are inflexible, and are not object-oriented.

Trolltech has invented a solution called "signals and slots." The signal and slots mechanism is a powerful inter-object communication mechanism that can be used to completely replace the crude callbacks and message maps used by legacy toolkits. Signals and slots are flexible, fully object-oriented, and implemented in C++.

شايفين كلمة تغليف او استعارة او طيّ(لف)

؟؟؟

:happy:

مش مكتوب اي شيء في المصادر الرسمية الموثوقة لـ Qt4...بخصوص السرعة ايضاً لم يذكروا اي شيء

بخصوص moc وباقي الأدوات ليس لها تأثير في السرعة او حتى اي تأثير مزعج او عائق...على العكس فهي ادوات ساعدت في نجاح تقنية Qt.

,.,.,.,.,.,.,.,.

بالرغم لم يذكروا أن هناك عيوب في السرعة والدليل انها implemented in C++.

,.,,.,.,.,.,.,.,.

ذكرتوني ارفع المسودة ضمن المواضيع المثبتة لأنها مجانية ورخصة مجانية لازم تكون بالقسم ضمن المقالات

شاكرة وممنونة

:happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالراحة بالراحة

انا من اكثر المعجبين بال QTو انا احب هذه المكتبة كثيرا, هذا للعلم فقط

يبدو ان المشاده فى الموضوع هنا فى امرين اثنين

1- هل ال QT تغلف الكول باك فى ال سيجنال ام لا, (اقراء الكود الناتج من الmoc )

2- موضوع السرعة (الفرق طفيف) لكن يزكر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ليس كل ما يكتب صحيح .. الفيصل هو الـbinary او الكود ان وجد !

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هل يُفهم ان مكتبة MFC تستخدم آلية callbacks ؟ كأني ارى مقارنة بين qt و mfc وان الاخيره تعتبر من :

بعض التقنيات الرسومية العتيقة مثل Win32-API
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
ليس كل ما يكتب صحيح .. الفيصل هو الـbinary او الكود ان وجد !

مزبوط...لما بيكون كلام ناس عاديين(متلنا) او محترفين...مش مؤسسة مطورة متل Trollech!!...لأن وراها من يسأل ويتبع كل كلمة بتكتبها وبتقولها...والسمعة ضرورية وغالية يعني على الأقل بيفرّطوا فيها بشيء اكبر من هيك

(تغليف) وتعليب وهدايا

:happy:

@justnow

ابداً ما في اي مشادة ..حاطة بمشاركتي رسومات تعبيرية

:happy: :happy:

It means that I am happy :happy: :happy: not angry :angry: . You see there is no any similarity between them and of course between SignalSlot and Callback mechanisms too :happy:

بخصوص السرعة الطفيفة...مش مهمة لو كانت في سبيل أمنية البيانات type-safe.

,.,.,.,,.,.

@مجلد جديد

آسفة...ولا مرة تعاملت مع مكتبة MFC او حتى قراءة بسيطة...

,.,.,.,.,.,.,.

كونوا بخير

:happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

اولا اريد ان اضع الان بعض الكود حتى لا يكون الحديث نظرى بحت

كان عندى برنامج كتبته وهو كان يرسم DFA. انا عارف ان كده انا بره الموضوع لكن سوف اعرض

بعض الكود مع حذف الكود الغير مهم بالنسبة لمشاركتنا هذه

فى هذا البرنامج انا استخدم MainDialog ككلاس الان انظر الى الملفات

MainDialog.h هذا الملف كتبته يدويا

#############################################################


{
Q_OBJECT
public:
MainDialog(QWidget *parent = 0);

protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent (QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent * event);

/*deleted stuff*/
private slots:


void on_addstate_pushButton_clicked();
void on_addtransition_pushButton_clicked();
void on_movestate_pushButton_clicked();
void on_makeaccepting_pushButton_clicked();
void on_makestart_pushButton_clicked();
void on_resetnfa_pushButton_clicked();
void on_nextcharacter_pushButton_clicked();


public:
/* deleted data members*/


};
class MainDialog : public QDialog , public Ui::MainDialog

#############################################################

الكود واضح, و انا استخدم ال Designer

الان انظر الى ال CPP file


OBJECTS = main.o \
MainDialog.o \ //I use this class
NFA.o \ //also I use it
State.o \ // yes this is my class
moc_MainDialog.o ///who is this files ????

لتعرف من اين جاء هذا الملف انظر الى الاتى

ساكتب لك الكود فى الملف moc_MainDialog.cpp لاحظ الى الكود الناتج و انت تعرف ما الذى يحدث

هذا الملف كتبه moc

/****************************************************************************
** Meta object code from reading C++ file 'MainDialog.h'
**
** Created: Mon Jun 25 15:13:10 2007
** by: The Qt Meta Object Compiler version 59 (Qt 4.3.0)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#include "MainDialog.h"
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'MainDialog.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 59
#error "This file was generated using the moc from 4.3.0. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif

static const uint qt_meta_data_MainDialog[] = {

// content:
1, // revision
0, // classname
0, 0, // classinfo
7, 10, // methods
0, 0, // properties
0, 0, // enums/sets

// slots: signature, parameters, type, tag, flags
12, 11, 11, 11, 0x08,
45, 11, 11, 11, 0x08,
83, 11, 11, 11, 0x08,
117, 11, 11, 11, 0x08,
155, 11, 11, 11, 0x08,
189, 11, 11, 11, 0x08,
222, 11, 11, 11, 0x08,

0 // eod
};

static const char qt_meta_stringdata_MainDialog[] = {
"MainDialog\0\0on_addstate_pushButton_clicked()\0"
"on_addtransition_pushButton_clicked()\0"
"on_movestate_pushButton_clicked()\0"
"on_makeaccepting_pushButton_clicked()\0"
"on_makestart_pushButton_clicked()\0"
"on_resetnfa_pushButton_clicked()\0"
"on_nextcharacter_pushButton_clicked()\0"
};

const QMetaObject MainDialog::staticMetaObject = {
{ &QDialog::staticMetaObject, qt_meta_stringdata_MainDialog,
qt_meta_data_MainDialog, 0 }
};

const QMetaObject *MainDialog::metaObject() const
{
return &staticMetaObject;
}

void *MainDialog::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_MainDialog))
return static_cast<void*>(const_cast< MainDialog*>(this));
if (!strcmp(_clname, "Ui::MainDialog"))
return static_cast< Ui::MainDialog*>(const_cast< MainDialog*>(this));
return QDialog::qt_metacast(_clname);
}

int MainDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QDialog::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: on_addstate_pushButton_clicked(); break;
case 1: on_addtransition_pushButton_clicked(); break;
case 2: on_movestate_pushButton_clicked(); break;
case 3: on_makeaccepting_pushButton_clicked(); break;
case 4: on_makestart_pushButton_clicked(); break;
case 5: on_resetnfa_pushButton_clicked(); break;
case 6: on_nextcharacter_pushButton_clicked(); break;
}
_id -= 7;
}
return _id;
}

ناتى الى قلب الموضوع moc_MainDialog.cpp فى البداية يبدا هذا الملف بالاعلان عن مصفوفة ثابتة

و اسمها يعبر عن استخدامها qt_meta_data_MainDialog الم اقل ان هناك RTTI هذه هى, و الاكثر من ذلك انظر الى

qt_meta_stringdata_MainDialog . كل هذه الاسماء للدوال من المفترض ان تذوب كليا بعد عملية الترجمة, ماذا تفعل هنا ؟؟؟؟

بعد ذلك يمكن ان نربط كل من المصفوفتين السابقتين حتى نشكل ال META_DATA نعم انها ال RTTI

البقية واضحة لكن الا تريد ان تلقى نظرة الى اخر دالة مكتوبة فى هذا الملف qt_metacall

هذه الداله تربط ال slots, الشئ الذى يجعل الموضوع يبدو سحريا وهو فى النهاية ليس الا CallBack

اتمنى ان يكون المثال واضحا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
بسم الله الرحمن الرحيم

هذه الداله تربط ال slots, الشئ الذى يجعل الموضوع يبدو سحريا وهو فى النهاية ليس الا CallBack

شاكرة لك هذا المجهود المبارك اخي...ولكن آسفة مش مقتنعة بكلامك بأن

SignalSlot == Callback

لسبب بسيط...احترامي إلك طبعاً وهو لن اقوم بتقديم معلومة هواة او محترفين مقابل نصوص رسمية وموثوقة من الشركة المطورة نفسها

:happy:

ممكن بتشبها ببعض الحالات ولكن ليست (ليست إلا)

,.,.,.,.,.,.,.

رمضان كريم

أجمل الأمنيات

:happy:

تم تعديل بواسطه رغَـد
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اهلا بالجميع ،،

موضوع جيد للمناقشة ، لكن يتطلب شخص على علم بالطريقتين.

اخي justnow :

The moc tool reads a C++ header file. If it finds one or more class declarations that contain the Q_OBJECT macro, it produces a C++ source file containing the meta-object code for those classes. Among other things, meta-object code is required for the signals and slots mechanism, the run-time type information, and the dynamic property system

اين هو الاثبات ان Qt تستخدم callback !

لا ارى اي register finction ولا اي function pointer ?

شكرا للجميع.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اهلا مجددا ..

Qt تطبق نمط المراقب Observer Pattern في عملية signal/slot

http://en.wikipedia.org/wiki/Observer_pattern

http://en.wikipedia.org/wiki/Signals_and_slots

وكمطور مبتدئ في Qt ، لا اهتم حاليا بماذا تستخدم Qt داخليا "لو اعرف تطبيقها لكنت حاليا معهم في نوكيا :lol: "

ما يهمني فعلا هو الواجهة النظيفة Clean Interface التي تقدمها لك signal/slot ،حيث جعلت عملية الربط غاية في السهولة وتتم فقط عبر عبارة connect ، ولا حاجة لان تكون الـ objects على علم بمن سيرتبط بها او شيء من هذا، ايضا بجانب عدم الخوف من حصول اي Craches للبرنامج في حالة فقد احد الـ objects الداخلة في عملية الربط .

signal/slot تتيح لك ربط اكثر من كائن Object بـ slot واحد ، ايضا ربط signal مع signal اخر ، وهذا ما يعطي البرنامج مرونة اكبر .

وهذه بعض من ميزاتها :

The signals and slots mechanism is type safe: the signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.) Since the signatures are compatible, the compiler can help us detect type mismatches. Signals and slots are loosely coupled: a class which emits a signal neither knows nor cares which slots receive the signal. Qt's signals and slots mechanism ensures that if you connect a signal to a slot, the slot will be called with the signal's parameters at the right time. Signals and slots can take any number of arguments of any type. They are completely typesafe: no more callback core dumps!

اما بالنسبة للمف الناتج من MOC ، فكما ذكرت في ردي السابق هو عبارة عن Preprocessor يقوم بقراءة اي هيدر يحوي الماكرو Q_OBJECT ، وبعدها كل اللي اعرفه عنه انه يجب ان يخرج لنا هيدر اخر متوافق مع لغة سي++ ، يعني بدون عبارة Q_OBJECT و SIGNAL و SLOT ،حتى يستطيع اي مترجم سي++ التعامل معه ، ففي الاخير Qtهي سي++ .

وتعليقا على :

ناتى الى قلب الموضوع moc_MainDialog.cpp فى البداية يبدا هذا الملف بالاعلان عن مصفوفة ثابتة

و اسمها يعبر عن استخدامها qt_meta_data_MainDialog الم اقل ان هناك RTTI هذه هى, و الاكثر من ذلك انظر الى

qt_meta_stringdata_MainDialog . كل هذه الاسماء للدوال من المفترض ان تذوب كليا بعد عملية الترجمة, ماذا تفعل هنا ؟؟؟؟

فقد لقيت احد الاجابات في Qt-interest Archive :

Well, these methods that moc "just adds" are precisely one of the keys

to Qt's signal/slot implementation ;)

Of course, the truth is probably more complex that this, but from the

look of it, the fundamental idea seems to be that moc assignates

individual ids to signals and slots and generates specialized virtual

methods to map those ids back to the actual functions. Calls to connect

probably associate a (sender-pointer + signal id) pair to a

(receiver-pointer + slot id) pair. When an object emits a signal, it can

then go through the list of connected objects and call each receiver's

mapper function with the adequate parameters.

دمتم بخير.

تم تعديل بواسطه SudaNix
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
وهذه بعض من ميزاتها :

دمتم بخير.

بخصوص الربط: عندي بالنوتة الخاصة تلخيص بسيط (ماني فاكرة صراحة من أي مصدر)!!

- واحد Signal ممكن أن يرتبط بأكثر من واحد Slot

- أكثر من واحد Signal (اي عدد) ممكن أن ترتبط بواحد Slot (نفس الـ Slot).

- الـ Signal الواحد ممكن أن يرتبط بـ Signal آخر. هذا يعني أننا نستطيع عمل ربط بين الـ Signals.

- و آخيراً الربط The connection ممكن أن يُبطل و يُفصل

:wacko:

دايخة من كتابتهن بالعربي الفصحى, هون اللغة الإنجليزية أسهل للأربع نقاط السابقة

[]- One signal can be connected to many slots.

[]- Many signals can be connected to the same slot.

[]- A signal can be connected to another signal.

[]- Connections can be removed.

هذه رغـد

منتديات الفريق العربي

من أمام و بينات الكُتب

(مراسلة صحفية)

:happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .