MFC

withnoname

New member
MFC

שלום לכולם... בניתי מספר טיימרים ב MFC והם עובדים. ואני לא מצליח לעצור את הטיימרים עם הפונקציה KILLTIMER ..אני מקבל הודעת שגיאה של WINDOWS . למישהו יש רעיון ?
 

amirjak

New member
כדי שתראה את הקוד

איפה אתה מנסה לעצור את הטיימרים?
 

withnoname

New member
בכול מקום אפשרי...

הבנתי שאי אפשר לעצור את הטיימרים בפונקציה ONTIMER, גם בפונקציות מחוץ לפונקציה ONTIMER אני לא מצליח.לדוגמא: uint myclass::stoptimer(uint idtimer) { if(!(KillTimer(idtimer)) return FALSE; //other return TRUE; }
 

gmorphus

New member
אנחנו חייבים לדעת יותר

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

withnoname

New member
אני מוסיף את השגיאה

אגב לגבי ההודעת שגיאה זו לא הודעה שקשורה לקומפילציה התוכנית רצה רק ברגע שהיא מגיעה לפונקציה של KILLTIMER יש הודעת מערכת
myclass:myclass { idtimer=SetTimer(timer1,2000,NULL); }​
 

gmorphus

New member
שוב אני שואל

איזו הודעת שגיאה אתה מקבל? תראה לי את ההודעה... האיתחול של הטיימר שלך נראה תקין. ואגב אני לא יודע על זה שאסור לקרוא ל KillTimer בתוך ON_TIMER. בכל מקרה, תנסה לעשות GetLastError אחרי קריאה של KillTimer שנכשלת ותגיד לי איזה ערך אתה מקבל. אגב, אתה לא חייב ממש לכתוב את הפונקציה בקוד, אתה יכול להכניס לwatch את הערך err,hr והוא יציג לך את השגיאה שקרתה.
 

gmorphus

New member
אני לא בטוח שאנחנו יכולים לעזור לך

בלי לראות את כל וזה לא ממש ריאלי. אני אסביר לך למה אני טוען זאת. שים לב שבהודעת השגיאה שהוא מעלה לך הוא כותב בדיוק באיזו שורה באיזה קובץ השגיאה. הפקודה עליה נפלת היא
ASSERT:):IsWindow(m_hWnd));​
למעשה אתה קראת ל KillTimer מתוך אובייקט CWnd שהוא לא באמת חלון. האובייקט שמתוכו אתה קורא לפונקציה הוא CWnd? ובפרט, האם הוא חלון valid? אתה יכול לנסות לעלות את כל הCPP שבו הקריאה הזאת נמצאת... אולי זה יעזור.
 

withnoname

New member
דווקא עזרת לי מאוד!!!!

תודה רבה רבה. הבעיה הייתה באמת קריאה לפונקציה מאובייקט שהוא לא באמת חלון.
 
אוי... אני שונא את ההודעה הזו...

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

gmorphus

New member
ממש לא../images/Emo70.gif

כתוב בפירוש שזה Debug Assertion Failure שזה אומר שהתוכנית הגיע לשורה שיש ASSERT. זה משהו שמתכנת מכניס ולא איזושהי דליפת זיכרון.
 

vinney

Well-known member
זה יכול להיות גם דליפת זכרון

בMFC יש מלא אסרטים על NULL פה אבל נראה לי שהטיימר כבר שוחרר ומנסים לשחרר אותו שוב
 

vinney

Well-known member
בעצם לא קראתי את השרשור עד הסוף

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

gmorphus

New member
אם שמו ASSERT שמצביע על דליפת זיכרו

ן אז אתה צודק. אבל הפואנטה שלי הייתה שהASSERT-ים האלה הם לא "אקראיים" או לא ידועים. "מישהו" שם אותם שם, וזה אכן מצביע על בעיה כלשהי, אבל לא בהכרח משהו לא ידוע.
 

amirjak

New member
יכול להיות

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