PDA

View Full Version : سوال: درخواست راهنمایی در مورد کد



smk311
یک شنبه 04 مرداد 1388, 17:22 عصر
سلام
دوستان کسی می تونه درباره کد زیر من را راهنمایی کند :

LAN CTE uses callbacks to dispatch events to applications. The following callback types are used by the Application API:
tGeneralEvtHandler
tCpEvtHandler
tDevEvtHandler


typedef void (CTE_EXPORT *tGeneralEvtHandler)
(
uint8 eventClass,
uint16 eventType,
uint16 eventName,
uint16 eventLength,
tEventMsg *pEvent
);


typedef void (CTE_EXPORT *tCpEvtHandler)
(
uint16 eventName,
uint16 eventLength,
tCpEvtMsg *pMsg
);



typedef void (CTE_EXPORT *tDevEvtHandler)
(
uint16 eventName,
uint16 eventLength,
tDeviceEvtMsg *pMsg
);



من واقعا متوجه نمی شم که این کدها چی هستن؟؟؟:متعجب:

Saeed_m_Farid
دوشنبه 05 مرداد 1388, 11:20 صبح
سلام

...
LAN CTE uses callbacks to dispatch events to applications. The following callback types are used by the Application API:
tGeneralEvtHandler
tCpEvtHandler
tDevEvtHandler
...

من واقعا متوجه نمی شم که این کدها چی هستن؟؟؟:متعجب:

سلام
همونطوريکه تو توضيحات اول typedef ها اومده اين قطعه کد، تکه اي از Definition يه روال Callback هست؛ اون سه تا تابع پردازش رخداد (Event) که تو توضيحات اوليه اومدن، توابعي هستند که بعنوان Callback function ثبت ميشن. به زبون ساده تر، سه تابع tGeneralEvtHandler, tCpEvtHandler و tDevEvtHandler توابعی هستند که تو یه جای دیگه تعریف شدن و از طریق این کد، تو سیستم ثبت میشن و شما می تونید از اونها استفاده کنید (اگه اشتباه نکنم، فکر مي کنم قسمتي از API استفاده از کارت شبکه باشه)

بصورت خلاصه مکانيزم Callback براي تعامل اشيائي (objects) که مستقلاً (جداگانه و جهت استفاده کاربر نهایی بدون اطلاع از نحوه استفاده ...) توسعه يافته اند مورد استفاده قرار مي گيره ...

يعني چي؟ ميشه اينطور توضيح داد که معمولاً شما وقتي برنامه يا زيرسيستمي مي نويسيد که از اشياء مشخص استفاده ميکنه، از کامپوننتهاي استفاده مي کنيد که کلاسهاي اونا رو مي شناسيد و مي دونيد از کلاسها و اعضاء اون چطوري استفاده کنيد، يا دقيقاً به شما مي گن که معني هر رخداد چيه و در چه موقعي چه Event اي دريافت خواهيد کرد و ... حالا اگه از يه کامپوننت ناشناخته استفاده کنيد، چطوري مي تونيد با اون ارتباط برقرار کنيد؟ براي اينکار معمولاً از مکانيزم Callback استفاده ميشه که ميتونه يه اعلام (notification) ساده باشه، يا يه ارتباط دوطرفه ايجاد بشه يا حتي يک فرآيند کامل کاري طراحي بشه ...
نمونه اي از مثال Callback ها رو مي تونيد تو شکل زير ببينيد :


http://www.codeproject.com/KB/cpp/ElmueCallbackDemo/Callback-Scheme.gif

تو این مثال، یه کلاس list شبیه سازی شده که با فراخوانی توابع خارجی داده ها رو مرتب میکنه. با انتساب توابع Callback مختلف، شما می تونید با روشهای متفاوتی لیستتون رو مرتب کنید. حالا فرقش با حالت معمولی یا روشهای دیگه چیه؟ تفاوت تو انعطاف پذیری کد هست، یعنی شما برای تنظیم نحوه مرتب سازی نیاز به تغییر کدتون تو cList ندارید، کافیه فراخواننده Callback با فراخواندن SetCallback هر موقع دلش خواست نحوه مرتب سازی رو تغییر بده، و این خیلی تفاوت داره با اینکه شما بیاین ارث بری انجام بدین یا تابع Compare تون رو overwrite کنید، و این چیزیه که جوهره ++C رو تشکیل میده (تکبیر!)


تفاوت فراخواني توابع Callback با ارتباط از طريق PostMessage ها اينه که وقتي يه تابع Callback رو صدا مي کنيد، کد شما به خط بعد نميره و تا اتمام کار اون تابع توقف مي کنه ولي ويندوز پروسيجري که پيغام PostMessage شما رو مديريت ميکنه، ميتونه بصورت موازي کارهاي ديگه رو انجام بده و پيغام شما رو هم تو صف کارهاش بذاره ...
در مورد پياده سازي و انواع Callback ها، با جستجو تو گوگل مثالهاي فراواني ميتونيد پيدا کنيد که اينجا نميشه کامل اونها رو بررسي کرد و فقط اگه موردي خواستيد سوال بپرسيد تا بشه توضيح داد.

توضيح کاملي تو اين زمينه (http://www.tutok.sk/fastgl/callback.html)

موفق باشيد.

Saeed_m_Farid
دوشنبه 05 مرداد 1388, 12:08 عصر
نحوه استفاده از 3 تابع مورد نظر یادم رفت بگم (گفتم شاید فقط نحوه استفاده رو میخواهید بدونید و من آسمون ریسمون بافتم!) :
شما یه متغیر از اشاره گر به تابع تون می سازید و پارامترها رو مقداردهی کرده و تابع رو فراخوانی می کنید، مثلاً :
typedef void (CTE_EXPORT *tGeneralEvtHandler)(uint8 eventClass,uint16 eventType,uint16 eventName,uint16 eventLength,tEventMsg *pEvent);
//...
//...
tGeneralEvtHandler mytGeneralEvtHandler;
// ec, et, en, el, evnt ==> متغیرهایی که قصد دارید به تابع بفرستید
mytGeneralEvtHandler(ec, et, en, el, evnt);