שאלה

טיקטי1

New member
שאלה

מישהו יודע במקרה איך עושים לולאת זמן ב-vc++ כלומר פקודה שגורמת לכך שפעולה מסוימת תתבצע כל כמה זמן? ועוד שאלה: האם יש איזושהיא פקודה ששולחת ל-LPT1 אות ( המורה שלי ל-c++ אמר משהו על outp)? תודה רבה מראש
 
תשובה

האם התוכנית שלך אמורה לעשות עוד משהו בזמן שאותה פקודה *לא* מתבצעת? אם התוכנית שלך פשוט אמורה לחכות (בלי לעשות כלום) בין הפעלה אחת של הפקודה להפעלה שאחריה, אז פשוט יש להשתמש בפקודה SLEEP:
for (i = 0; i < 10; ++i) { doSomething(); Sleep(2500); <--- sleep for 2.5 seconds }​
אם התוכנית שלך אמורה לעשות משהו בין הפעלה אחת של הפקודה להפעלה שאחריה, אז תאר/י לי את הבעיה בצורה יותר מפורטת. עקרונית, צריך "לפצל" את התוכנית לשתי "תתי-תוכניות" או THREADS, שיתבצעו במקביל: האחת, תפעיל את הפקודה המבוקשת כל זמן מסויים (היא תיראה בדיוק כמו הלולאה שכתבתי למעלה), והשניה תמשיך לעשות דברים אחרים. ה"פיצול" נעשה באמצעות פקודות כמו BEGINTHREAD. לגבי שליחת תווים ל-LPT1, צריך לעשות את זה בזהירות כאשר עובדים בסביבות כמו XP/2000 וכו'. אני חושב שאם תפתח/י קובץ בשם "LPT1" בצורה הרגילה (FOPEN או ע"י שימוש ב-IOSTREAM), אז יהיה אפשר פשוט לכתוב אליו תווים והם יגיעו למדפסת. אבל עבר הרבה זמן מאז שניסיתי
מה שבטוח, נסיון כזה לא יכול להזיק....
 

טיקטי1

New member
תודה רבה ../images/Emo24.gif והמשך

אני צריך לשלוט במפסק בגלל זה אני משתמש ב-LPT1 אני לא צריך לשלוח תווים אלא רק פקודה לפתוח את המפסק או לא (המורה שלי אמר שנשלחים 8 סיביות כאשר ה-7 הראשונות הם 0 והאחרונה היא 1) מישהו יודע במקרה על פקודה כזו שוב תודה רבה ותודה מראש
 

טיקטי1

New member
תוספת

המורה שלי כתב את הקוד הבא באסמבלי (+-) שאמור לעשות mov al,1 mov 378h,al כאן באה עוד שורה (או יותר) שאני לא זוכר תוכלו בבקשה להגיד לי זה הקוד הנכון ואים לא לתקן תודה מראש
 
תיקון:

mov al,1 mov dx,378h out dx, al​
הבעיה היא שאני לא ממש בטוח שזה יעבוד תחת מערכות הפעלה כמו XP, אלא רק תחת מערכות הפעלה כמו DOS (נקי - לא חלון DOS בתוך XP או משהו כזה) או WIN9X. אבל תנסה. במקרה הכי גרוע, אם אתה מפעיל את התוכנית מתוך WINDOWS, אתה תקבל הודעה שהתוכנית שלך ניסתה לעשות פעולה לא חוקית ולכן תיסגר, או משהו דומה.
 

אלדד28

New member
צריך Message loop, בהחלט,

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

אלדד28

New member
כן, אבל לא ShowWindow.

כלומר, "חלון" יכול להיות סתם עוד אובייקט קרנל. Service-ים, למשל, לא נוהגים להיות אינטראקטיביים ולפתוח לך חלונות; ובכל זאת הם יכולים לעשות שימוש ב-timer-ים אם הם עושים "חלון מדומה".
 
בדיחה:

שמים פיסיקאי ומתמטיקאי בחדר סגור עם 4 קירות. בפינה הסמוכה להם יש מטבע. המטרה שלהם היא להגיע למטבע. הולך הפיסיקאי לאורך הקיר הישר אל המטבע ומרים אותו. המתמטיקאי עושה את אותו הדבר. כעת, שמים את המטבע בפינה שממולם, ולא בפינה הסמוכה. הולך הפיסיקאי לאורך מרכז החדר הישר למטבע ומרים אותו. המתמטיקאי הולך לאורך הקיר לפינה הסמוכה, ומשם הוא כבר יודע איך לפתור את הבעיה... מסקנה: אם צריך משהו שרץ ברקע ועושה BEEP כל 5 שניות, לא בונים חלון נסתר עםMESSAGE LOOP עם TIMERS כי "משם אנחנו כבר יודעים איך לפתור את זה".
 

אלדד28

New member
בדיחה ישנה ../images/Emo6.gif מה שאמרת נכון מאוד,

כלומר - לא צריך לעשות את זה עם timer-ים, אבל אני נוטה להסתכל על הבעיה כבעיה עקרונית, ולא כבעיה ספציפית, לפני שאני בוחר את אחד המימושים. עדיף קודם להכיר את כל (או את רוב) הדרכים לביצוע X, ואז לשקול מה הכי כדאי. כדי לעשות beep כל חמש שניות ברור שהייתי מרים thread נפרד שעושה beep ו-sleep, אבל שים לב שהשאלה המקורית הייתה הרבה יותר תיאורטית (ואולי פחות מדי מפורטת).
 
../images/Emo45.gif

אכן בדיחה ישנה... אבל אם תשים לב, תוכל לראות שכל הדיון על חלונות נסתרים, משאבות מסרים וקוצבי זמנים הופך להיות לא רלוונטי החל מ-21/01/04 בשעה 16:16.
 

אלדד28

New member
היי, לא חייבים להיצמד לדיון.

אם יש משהו אחר שמעניין את המתדיינים, אין סיבה שלא לדון בו - לא ככה?
 

ברנדל

New member
לא צריך חלון מדומה

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

צריך MESSAGE LOOP. זה מה שטענתי מלכתחילה. גם אם לא מעבירים HANDLE לחלון, אלא CALLBACK, עדיין צריך ליישם MESSAGE LOOP, כי אם לא מבצעים DispatchMessage, אז אף אחד לא יקרא ל-CALLBACK FUNCTION.
 
למעלה