תוכניתני ++C

sharon669

New member
תוכניתני ++C

אני מנסה לחשוב על ארכיטקטורה ואשמח לדעת אם זה אפשרי מדובר על סביבת חלונות win32/Mfc יש לי אפליקציה -> ודיאלאל 1 אפליקציה מטעינה את ה DLL ושולחת לו כתובת של פונקציה מסויימת 2 ברגע שה ל DLL יש מידע מוכן הוא מפעיל את הפונקציה שנשלחה לו ובתור פרמטר נותן לה מידע . נראה לי שזה callback function האם זה אפשרי ? ואם אפשר לקבל הכוונה ברשת לדוגמא כזאת זה יעזור לי . תודה , שרון
 

gilad_no

New member
אפשרי

פשוט תגדיר את טיפוס הקריאה בתור TYPEDEF ותן אותו בתור פרמטר לפונקציה. ואז תגדיר פונקציה ע"פ הגדרת הTYPEDEF ותעביר אותה בתור פרמטר (כמובן פונקציה סטטית או גלובלית - לא חברת מחלקה).
 

odstudio

New member
תוספת קטנה...

כשאתה כותב "...ברגע של- DLL יש מידע מוכן...", אתה מודע לכך שאתה עומד לכתוב אפליקציית Multithreaded? כלומר, התוכנית שאתה כותב תרוץ ב- thread הראשי, אך בשביל שה- DLL יקרא לפונקצייה רק מתי שהוא "מוכן עם מידע", צריך לרוץ עוד thread שאותו כנראה תיצור בעת טעינת ה- DLL. אז זהו, רק רציתי לוודא שאתה לוקח גם את זה בחשבון, כי יש לכך השלכות על תיכנון כל האפליקציה שלך. מקווה שהבנת את ההערה שלי, ואם לא אשמח לענות על שאלות.
 

gilad_no

New member
ממש לא

הוא קורא לפונקציה מתי שבא לו. זה לא קשור בכלל לMT. זה בדיוק הרעיון של CALLBACK.
 

odstudio

New member
לא הבנת

אני פשוט קיבלתי תחושה שזה מה שהוא רוצה שהתוכנית שלו תעשה, מתוך הניסוח של השאלה שלו. לכן הערתי את ההערה הזאת. בכל אופן, אם התכנית לא Multithreaded, זה אומר שפונקציית ה- callback תיקרא כפועל יוצא של קריאה קודמת לפונקציה אחרת של ה- DLL. למשל, אם קוראים ב- main לפונקציה DoSomething המיוצאת מה- DLL, והפונקציה DoSomething היא זאת שתיקרא ל- Callback. בכל מקרה, עד ש- "ל-DLL יהיה מידע מוכן", התכנית "תחכה" לקריאת פונקציית ה- callback ורק אז היא "תמשיך" לרוץ.
 

sharon669

New member
Multithreaded program

התוכנית אכן אמורה להיות Multithreaded , הממשק הראשי רץ בנפרד , וה DLL רץ בנפרד ! אבל ברגע שאני מטעין את הDLL בעזרת loadLibrary הוא רץ בנפרד עם לולאה משלו האם יש דברים שאני צריך לקחת בחשבון ? בכל מקרה , החלק הבעייתי בתכנון זה הקריאות וקבלת מידע מפונקצית CallBack יש למישהו דוגמא אולי ? תודה .
 

gilad_no

New member
אם הוא רץ בנפרד,

תעבוד עם הודעות. תשלח הודעות מLOOP אחד לשני. זה הרבה יותר בטוח והרבה יותר נכון.
 

sharon669

New member
הודעות

אתה בטוח שזה יותר נכון ? זה נראה יותר נכון לתכנת יישום כזה עם CallBack . בכל מקרה , אני תוכניתן JAVA ומתחיל צעדים ראשונים ב ++C, אשמח לקבל הסבר קצרצר למימוש , או של CallBack ו DLL או למימוש שלך עם ההודעות . לפי מה שאני מבין אני צריך ליצור הודעה מותאמת אישית נניח WM_DATA ולשלוח אותה חזרה לאפליקציה ובפרמטרים של wndProc לשלוח את המידע . איך אני שולח את ההודעה מה DLL לחלון הראשי ? ואם אני אשתמש בסופו של דבר ב MFC האם אז העדיפות ל CallBack משתנה ? תודה רבה שרון
 

gilad_no

New member
הודעות

כאשר עובדים ביישומי MT, עדיף לעבוד עם הודעות כדי לדאוג לסינכרון נכון יותר. כך מבטיחים שכל ארוע ייתבצע במהלך הMESSAGE PUMP של הTHREAD הפעיל ויימנע מצב של התנגשות. כדי לשלוח הודעה לחלון, תוכל להשתמש בSENDMESSAGE\POSTMESSAGE. אם אין לך חלון, תוכל להשתמש בPostThreadMessage.
 

vinney

Well-known member
תלוי בצורך

לדעתי אתה צריך CALLBACK דווקא הודעות זה טוב אם יש לך דיבור רציף בין DLL לאפליקציה ראשית. מנגנון ההודעות מבטיח שבזמן שאתה מטפל בהודעה אחת, הבאות יחכו בתור לפי סדר ההגעה, וככה לא יתפספס כלום CALLBACK לעומת זאת יכולה להקרא מספר פעמים במקביל, והמופעים שלה לא יהיו תלויים אחד בשני, ויכול להיות שהקריאה הראשונה ל CALLBACK תסיים אחרונה. במקרה זה, אם הקריאות קשורות זו לזו יכולה להיות בעיה של סנכרון. אם אתה יודע שהDLL יקרא לCALLBACK פעם אחת בלבד בפרק זמן (של יותר מכמה שניות, נניח שהפונקציה שלך לא גדולה), אז זה עדיף על לטפל בהודעות, ופשוט יותר.
 

gilad_no

New member
גם נכון

נסה לפרט את מטרת היישום שלך ונוכל לעזור להתאים לך פיתרון.
 

sharon669

New member
פירוט שלך האפליקציה

מדובר על סביבת חלונות win32 / Mfc יש לי אפליקציה ו DLL ה DLL רץ ב RealTime כל הזמן , ברגע שהוא מרגיש מידע מסויים ( נניח ב COM1 ) הוא מפעיל באפליקציה קריאה לפונקציית CallBack ומעביר לה מערך של BYTE או מצביע למערך של BYTE . אני כמעט בטוח שזה callback function כי אני לא רוצה שיהיה עיכוב בגלל המערכת של ההודעות . פירוק לשלבים : 1 ) אפליקציה מטעינה את ה DLL 2) DLL רץ , אפליקציה רצה 3) DLL מריח מידע (מקלדת , COM1 ) מפעיל פונקצייה באפליקציה ושלוח לה את המידע שנקלט 4) DLL ממשיך לרוצ ולהאזין , אפליקציה מעבדת את המידע שהגיע . תודה רבה על התגובות , שרון .
 

odstudio

New member
שים לב -

ברגע שה- DLL קורא לפונקצית ה- callback, ה- thread של ה- DLL "תקוע" עד לחזרה מהפונקציה. זמן השהייה ב- callback צריך להיות קצר ככל האפשר. בכל מקרה, אני מסכים עם gilad_no שעדיף לשלוח הודעה מאשר לקרוא ל- callback מכיוון שאז נשמר הסינכרון ולא צריך להתחיל להתעסק עם הגנות באמצעות critical-sections או events ושאר אובייקטי-סינכרון של Windows. במידה וב- thread הראשי יש לך GUI שמן הסתם מבוסס על חלון/ות, רצוי ואף הכרחי להשתמש בשליחת הודעות בין ה- threads . מה שכן, שליחת פרמטרים ע"י הודעות היא מסורבלת יותר מאשר שליחת פרמטרים דרך קריאה לפונקציה (ה- callback), אבל עדיף "לסרבל" מעט מאשר לסבך הרבה יותר את התוכנית באמצעות שימוש באובייקטי סינכרון.
 

vinney

Well-known member
מאיפה הבאת את זה???

שטויות במיץ, תסלח לי. callback שלא מסתמך על תוצאות קודמות נותן מענה מצוין, ולא צריך שום סנכרון ו critical sections. בדרך כלל משתמשים ב сallback כשרוצים שהתהליך הנוסף יעדכן את התהליך הראשי בתוצאות, שהתהליך הראשי לא ממש זקוק להן כרגע, אבל יזדקק אחר כך. שימוש בהודעות יגרום לתוצאות האלה לחכות זמן לא ידוע בתור, שימוש ב callback לעומת זאת יביא את התוצאות מייד. שוב, הכל עניין של ארכיטקטורה, להגיד שהודעות עדיפות על callback זה כמו להגיד שג'יפ 4X4 עדיף על משפחתית...
 

sharon669

New member
יש למישהו דוגמאות פשוטות ,

לקריאות callback מתוך DLL הדוגמאות שאני מוצא באינטרנט לא רלוונטיות \ מתוסבכות מדי תודה
 
למעלה