threads בc++ וDLLS

ASP zone

New member
threads בc++ וDLLS

מישהו יכול להסביר לי איך עושים את זה? ובכלל מה זה עושה? איך אני מכליל DLL בc++? איך אני מונע שיווצר circular references?
 

gmorphus

New member
לאט לאט

אין קשר בין הדברים. תשאל שאלה ספציפית יותר...
 

Moridin

New member
תגובה

ת'רדים: ב-C++ יש לך שתי אפשרויות - מה-CRT את הפונקציה _beginthread (הקו התחתון בא לפני...), וב-Win32API את הפונקציה CreateThread. גגל על שתי אלה. DLLים - נו באמת... חיפוש פשוט בגוגל יתן לך את הפונקציות הרלוונטיות ב-win32api. למה אתה מתכוון ב-circular references?
 

ASP zone

New member
circular reference זה:

int *a, *b; a = &b; b = &a;​
כמובן שהקומפיילר לא יאשר את זה כי הוא לא יודע לאן לפנות אותו דבר עם DLLים. מה זה thread ולמה הוא משמש?
 

® רן

New member
יש לך בלבול בסיסי במושגים

הקוד שלך לא יתקמפל לא בגלל Circular Reference (שאין לי מושג מה זה) אלא בגלל שהטיפוסים שלך לא נכונים. a הוא מטיפוס "מצביע ל int". כנ"ל b. כשאתה עושה a = &b אתה מנסה להציב ב a ערך מטיפוס "מצביע למצביע ל int" שזה טיפוס שונה. אם תבדוק תראה שגם השמה אחת בלבד ממה שעשית לא תתקמפל:
int *a, *b; a = &b;​
 

ASP zone

New member
זאת הייתה הדגמה

אני לא אומר שזאת הבעיה עם פוינרים שמצביעים אחד לשני. אצל DLLים יש. אם אתה מכליל DLL ראשון בתוך השני ואת השני בתוך הראשון נוצר לך circular reference.
 

vinney

Well-known member
ניתן לפתור את זה גם

אתה לא מעלה DLL עם העלאת התוכנה שלך, אלא רק כשאתה עושה קריאה כלשהי, ואז זה יפתר.
 

ASP zone

New member
כן אבל

כל שנייה להקצות ולמחוק זיכרון זה סיוט וגם לא יעיל
 

vinney

Well-known member
מה זאת אומרת?

מה הקשר להקצאות ומחיקות של זכרון? DLLים מנוהלים על ידי מערכת ההפעלה, אני לא מבין באיזה הקשר אתה נתקל בבעיה הזאת בכלל.
 

vinney

Well-known member
פוינטר?

לא, יש להם HANDLE שמערכת ההפעלה נותנת. לא ברור לי על איזה פוינטר אתה מדבר. אם יש לך שני DLLים שמשתפים מידע וקשורים אחד לשני, למה אתה מפריד בינהם מלכתחילה?
 

DadleFish

New member
מה?

מה זה "מכליל DLL"? אין כזה דבר. אתה יכול להגדיר לפרויקט X שהוא משתמש ב-DLL-ים A,B,C, ואז כל ה-DLL-ים יכולים לדבר אחד עם השני (להפעיל פונקציות אחד של השני, למשל). אתה יכול לחילופין לעשות LOAD סטטי ל-DLL, תוך שימוש בפונקציה LoadLibrary - אבל גם זו לא בעיה, גם אם A יעשה LoadLibrary ל-B ואז B יעשה LoadLibrary ל-A, זה עדיין יהיה בסדר ולא תהיה לך התנגשות. המקום היחיד שבו אני יכול לחשוב על circular reference הוא ב-header files, למשל אם A.h עושה include ל-B.h שעושה בתורו include ל-A.h, אבל זה ייכשל בזמן הקומפילציה.
 

ASP zone

New member
בסדר אבל

אם A קורא לB מתוך A וB קורא לA מתוך B. כאילו לא מתוך התוכנית הראשית.
 

vinney

Well-known member
באג בדיזיין => ז*ן בדיבאג

שמעת פעם? זה נראה כאילו אתה מתעסק עם דיזיין מאוד מאוד דפוק.
 

ASP zone

New member
אז מה שאתה אומר הוא

שאני צריך לגשת להכל דרך הEXE? ומה אם אני רוצה לשלוח מידע מA לB?
 

DadleFish

New member
אין שום בעיה עם מה שאתה אומר

הכל שאלה של מה בדיוק ה-DESIGN שלך. בוא נניח שיש לך שני DLL-ים. ה-DLL האחד מטפל בכל הקבצים שיש בתוכנה שלך. בין היתר, יש לו CFileManager, שלו צריך לדווח על כל קובץ שנפתח, נגיד דרך הפונקציה RegisterFile. ה-DLL השני מטפל בכל המחרוזות שיש בתוכנה שלך. בין היתר יש לו CStringManager, שלו צריך לדווח על כל מחרוזת חדשה בתוכנה, נגיד דרך הפונקציה RegisterString. כעת בוא נניח ש-CStringManager רוצה לכתוב לאיזשהו קובץ מידע סטטיסטי על המחרוזות הקיימות בפרויקט; זה אומר ש-STRINGS.DLL צריך לפנות ל-FILES.DLL. עד כאן, סבבה. עכשיו נניח בנוסף, ש-CFileManager צריך באיזשהו שלב להמציא מחרוזת חדשה, לא משנה למה. אם כן, FILES.DLL יפנה ל-STRINGS.DLL. מה הבעיה?
 

gmorphus

New member
על מה לעזאזל אתה מדבר?

אני לא הצלחתי להבין מה הבעיה שלך ומה אתה מנסה לעשות. אתה מבלבל בין כמה נושאים: 1. פוינטרים והקצאות - זה דבר אחד שלא קשור לשום דבר אחר שהזכרת. 2. circular reference - לא בדיוק סגור למה שאתה מתכוון, אבל נראה לי שאתה מתכוון למצב שבו header file אחד עושה include לשני, והשני עושה include לראשון. אז יכולה להיות לך בעיה, אבל זה בכלל לא יתקמפל כמו שאלדד אמר, וחוץ מזה, זה לא קשור לDLL-ים. 3. DLL - נראה שאתה לא ממש מבין מה זה DLL אז תחזור ותקרא בדיוק מה זה DLL ואיך משתמשים בזה.
 
למעלה