שאלה

ברנדל

New member
קיצר כולם צודקים

פשוט לא צריך לספק את פרמטר החלון, יווצר באמת חלון default בשביל לטפל בהודעה WM_TIMER, כנראה כפי שאתה ואלדד התכוונתם.
 

אלדד28

New member
לא בדיוק, ברנדל

אתה צריך לדאוג למימוש החלון וה-message pump. כמו שאינגו אמר, DispatchMessage חייבת להיקרא כדי שה-Callback תיקרא; כדי לקרוא ל-Dispatch, אתה צריך GetMessage - והיא דורשת hwnd.
 
לא בדיוק, אלדד

אם אתה יותר TIMER בלי HWND, אז ה-DEFAULT WINDOW PROC קוראת ל-CALLBACK FUNCTION שלך. אתה לא צריך HWND. אתה רק צריך DISPATCH.
 

gilad_no

New member
כולם טועים (כמעט) ../images/Emo3.gif

צדק ברנדל כשאמר שאפשר לקרוא לSETTIMER ללא חלון, וצדק אלדד כשאמר שצריך לממש MESSAGE LOOP, אבל לא חייבים ליצור שום חלון (ושום חלון גם לא יווצר כאשר קוראים לSETTIMER). צריך בסה"כ לממש MESSAGE LOOP פשוט ביותר (גם ללא חלון - עם NULL) רק כדי לא לתקוע את היישום ולהכניס אותו למצב IDLE במהלך הסינכרון של הקרנל. הCALLBACK תיקרא כאשר יעבור פרק הזמן המתאים ללא שום קשר לחלון.
 

ברנדל

New member
נו, זה בדיוק מה שאמרתי

המתכנת לא צריך לשלוח handle של חלון לפונקציה. ואכן יסופק אוטומטית default window שיטפל בהודעה WM_TIMER ופונקציית ה CALLBACK , תיקרא.
 

gilad_no

New member
לא יסופק שום חלון

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

ברנדל

New member
כן צודק הכוונה

היתה ל DEFAULT WINDOWPROC , קיצר לאלמנט שמטפל בהודעה של WM_TIMER, שכאן הוא באמת פונקציה בלבד.
 

טיקטי1

New member
לגבי ה-Sleep אני כותב תוכנית די

דומה למה שתיארת (רק שבהתחלה אני כותב שתי הודעות ומקבל שני משתנים ורק אז באה הלולאה) ובמקום לחכות בין ריצה אחת של הלולאה לשנייה הוא לא עושה כלום במשך זמן מסויים ואז מבצע את מה שבתוך הלולאה בלי לחכות אתה יודע במקרה מה הבעיה? תודה מראש
 
אז ככה:

קודם כל, האם עברת על התוכנית ב-DEBUGGER? האם קורה שם משהו "חשוד"? אם זה לא עוזר, תעלה בבקשה את הקוד, כי לא כ"כ הבנתי מדבריך איך הוא נראה.
 

טיקטי1

New member
לא העברתי על התוכנית debugger

זאת התוכנית בערך:
#include<WINDOWS> #include<iostream.h> void main() { int i,num; long time; cout<<"enter the number of times"; cin<<num; cout<<"enter the time diffrence between each time"; cin<<time; for(i=0;i<num;i++) { cout<<"sending..."; Sleep(time); } }​
 

טיקטי1

New member
תיקון והערה

cin<< x אמור להיות cin>> x ובמקום cout<<"sendung..." x אמור להיות משהו אחר אבל בשביל להראות את העיקרון לא נראה לי שזה משנה
 
קודם כל,

תריץ ב-DEBUGGER. בדוק את הערכים של NUM ו-TIME בזמן הריצה. אח"כ נראה מה אפשר לעשות. בסיידר?
 

טיקטי1

New member
אני אוכל להריץ debugger רק מחר

ואז זה יהיה מאוחר מדי יש לך או למישהו אחר רעיון למה יכולה להיות הבעיה או דרך אחרת לפתרון? תודה רבה ותודה מראש
 
נראה לי

שהתוכנית בסדר, אבל הקלט אולי לא בסדר... ניחוש קטן: זכור ש-TIME הוא ביחידות MILISECONDS, כלומר, אם אתה רוצה לחכות 2 שניות, הקלט ל-TIME אמור להיות 2000.
 

טיקטי1

New member
זכרתי שזה ב-miliseconds

באחת מההרצות נתתי ל-time ערך של 5000 וזה עדיין הדפיס את הפלט על המסך בלי לחכות ולפני שהוא הדפיס את הערך הוא חיכה במשך זמן מסוים רעיון אולי להוסיף מעל הלולאה הראשית לולאה נוספת (כלומר שיווצר מצב של לולאה בתוך לולאה) ובגלל שכעת (בלי הוספת הלולאה) ה-Sleep מופעל לפני הלולאה הלולאה שתיוסף תגרום לו לפעול עוד פעמים ואז אפשר להוסיף תנאי בתוך הלולאה המשנית שיגרום ל-Sleep לפעול בכמות הפעמים שאני רוצה אתה חושב שזה יעבוד? שוב תודה
ותודה מראש
 
לא הבנתי את הכל.

אבל יכול להיות שמה שאתה צריך זה פשוט להחליף בין פקודת ה-SLEEP לבין הפלט של "SENDING" ? אני מבין שאתה רוצה שיקרה הדבר הבא: יקלט NUM (נניח 3) יקלט TIME (נניח 5) ...כלום במשך 5 שניות... יודפס SENDING ...כלום במשך 5 שניות... יודפס SENDING ...כלום במשך 5 שניות... יודפס SENDING אני צודק? אם כן, אז באמת כל מה שאתה צריך, זה להחליף את סדר הפקודות SLEEP וההדפסה של SENDING (בתוך הלולאה).
 
למעלה