נבצרתי מלהבין...

MotiAd

New member
נבצרתי מלהבין...

אז ככה חברה: יש לי מחלקה בשם:
CCommandParser​
ומוגדרת בה פונקציה ציבורית:
DWORD WINAPI StartParsing(LPVOID lpParameter);​
בקובץ המימוש היא מופיעה כך:
DWORD WINAPI CCommandParser::StartParsing(LPVOID lpParameter){...}​
יש לי פונקציה int main שבונה משתנה מהמחלקה הזו ויוצרת Thread מהפונקציה שהזכרתי קודם. עכשיו, יש משהו פגום בהגדרה? כי השמטה של המילה WINAPI גם מקובץ המימוש או לחילופין מקובץ ההגדרה או ביחד ולחוד וכו' לא עזרה. השגיאה שאני מקבל בקימפול היא C2664, "error C2664: 'CreateThread' : cannot convert parameter 3 from 'DWORD (LPVOID)' to 'LPTHREAD_START_ROUTINE' None of the functions with this name in scope match the target type" והשורה בפונקציית main היא:
hh = CreateThread(NULL, NULL, ccmd_parse.StartParsing, NULL, NULL, &WndThreadID);​
אני לא מחפש את התקינות בקריאה לשורה כי זה לא קריטי נכון לעכשיו. הקריאה הזו עבדה מצויין עבור פונקצייה שהוגדרה באותו הקובץ של פונקציית main אבל עכשיו זה לא עובד. יש מושג? אני אשמח להצעות. שלכם, מוטי.
 

DNile

New member
חחחחחח..

אם רק הייתי מקבל שקל על כל פעם שעניתי על השאלה הזאת, לא הייתי מתלונן על המשכורת שלי עכשיו. התשובה נעוצה בחוסר הבנה של מה הולך "מאחורי הקלעים" של CPP, ואיך כל הקוד CPP שלך מומר לאסמבלי. מבלי להכנס ליותר מדי הסברים, רק אומר שפונקציות מחלקה שאינן סטטיות, מקבלות פרמטר this בלתי נראה. ככה הפונקציה יודעת להבדיל בין קריאה של:
Avi.SetAge(18); לבין Yossi.SetAge(33);​
מה שאתה רצית לעשות זה כאילו להעביר מצביע לAvi.SetAge. הבעיה עם זה זה שהקריאה לAvi.SetAge כוללת למעשה 2 מצביעים. מצביע אחד - לפונקציה SetAge. מצביע נוסף - לAvi. איך נהוג לפטור בעיה כזאת? ודאי שמת לב שפונקציית Thread מקבלת פרמטר LPVOID, שאתה קובע בקריאה לCreateThread(אם לא שמת לב, שים לב עכשיו!). המצביע שאתה יכול להעביר במקרה הזה יהיה מצביע לאובייקט שעליו אתה רוצה להפעיל את הפונקציה. ואז, אחרי שקיבלת מצביע לAvi,אתה יכול לקרוא לפונקציות שלו. שים לב שבקוד הבא, ThreadFunction היא פונקציה סטטית של מחלקת Programmer
DWORD WINAPI Programmer::ThreadFunction() { Programmer pProgrammer = (Programmer)lpVoid; return pProgrammer->StartProgrammingInAnotherThread(); }​
 

MotiAd

New member
לא לזה התכוונתי...

מה שאמרת היה לי ברור מלכתחילה. אני אמצא דרך אחרת לעשות את זה. הגועל נפש של ++VC.
 

MotiAd

New member
אני אבנה את ה-...

Thread בתוך המחלקה עצמה, ז"א בתוך פונקציה פנימית. זה עדיף. סתם כאב ראש.
 
למעלה