עזרה בג'אווה

עזרה בג'אווה

היי, אני כותבת איזשהו משחק בג'אווה, וקצת תקועה... (כן, זו אני שמידי פעם מציקה לכם כאן בשאלות בנושא...) השאלה שלי היא כזאת: אני מעוניינת להציג צורה כלשהי על המסך, ואז להפעיל טיימר. במשך זמן מוקצב (המוגדר מראש), יש המתנה לאירוע משתמש (לחיצה על עכבר, לחיצה על מקש...). לאחר שהסתיים הזמן הזה, וללא כל חשיבות אם המשתמש הגיב או לא, יש ציור של צורה חדשה וכו'... השאלה שלי- איך עושים את זה? בהתחלה חשבתי שלאחר כל פעם שמופיעה צורה, ירוץ תהליכון שיבצע SLEEP למשך הזמן המוגדר, אבל- איך אדע שהוא סיים לרוץ, והגיע הזמן להופעת צורה חדשה? (הערה: ליתר דיוק, הצורה אמורה להופיע זמן מסויים- נניח 50 מילישניות, ואז המסך ריק, מחכים עוד זמן- נניח 1000 מילישניות, ואז מציגים צורה חדשה. מרגע הופעת הצורה ועד להופעת הצורה החדשה יש הקשבה לאירועי משתמש...) אשמח מאוד אם תוכלו לעזור לי... המון תודה....
 

asihiz

New member
מאד פשוט...

את יוצרת מחלקה(נגיד paintpanel) ובה את מציירת את הצורה הראשונה,מפעילה טיימר של זמן הופעת הצורה הראשונה,לאחר סיום הטיימר מציירת מלבן בצבע הרקע(כלומר לצייר את האין צורה),מפעילה טיימר שני,ואז בסופו מציירת את הצורה השנייה. אם את יוצרת תהליכונים שדורשים סינכרון אז זה קצת יותר מסובך(אבל אפשרי בהחלט),רק זיכרי,אין לדעת מה זמן ריצה מדויק של תהליך מראש...
 
עוד שאלות.. ../images/Emo4.gif

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

asihiz

New member
תשובות...

לפי הסדר... 1)את יודעת מה התוכנית אמורה לעשות כאשר הטיימר הסתיים,למשל ציור צורה,הטיימר ירוץ את פרק הזמן שלו והצורה תופיע. 2)sleep זה הדרך לעשות השהיה של זמן מדויק.אין עוד פקודה כזו. 3)לפי שאלותייך את לא יודעת ליצור תהליכונים(threads).זהו נושא בפני עצמו שאני ממליץ לך בחום ללמוד,כאן קצרה היריעה מלפרוש את כל הנושא,אם לאחר שתתנסי בזה יהיו לך שאלות אשמח לעזור. 4)סינכרון תהליכים זה נושא ששיך ליצירת תהליכים...ראי תשובה מספר 3. בהצלחה...
 

asihiz

New member
לגבי השאלה האחרונה...

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

ואכן... לפי הסדר... 1) לצערי, לא ממש הבנתי... ברור שאני יודעת מה עלי לעשות כשהטיימר הסתיים- השאלה היא איך אני יודעת שהוא הסתיים! כלומר, אני מציגה צורה ומפעילה (בתהליכון) טיימר, בו יש SLEEP, והזמן הזה התוכנית עצמה (לא התהליכון) מקשיבה לאירועי משתמש. השאלה היא- איך אני יודעת שהתהליכון הסתיים, ועלי ליצור צורה חדשה? חשבתי לעשות משתמנה מחלקה בוליאני שיקבל ערך TRUE כשהתהליכון מסתיים, ובתוכנית עצמה תהיה לולאה- כל זמן שהמשתנה אינו TRUE, המשך להקשיב. ביציאה מהלולאה- יתבצע REPAINT וכו'. שתי בעיות עם זה: א. לא נראה לי נכון ב. האם כשתוכנית שלי עסוקה בריצת לולאה, היא יכולה במקביל להקשיב לאירועים? 3) תהליכונים, אני מודה ומתוודה, איני יודעת היטב- בטח לא בג'אווה (בC קצת יותר...) ואכן, הגיע הזמן ללמוד את זה. פשוט במקרה הזה לא חשבתי שזה אמור להיות מורכב מידי... אשמח אם תתקן אותי... תודה רבה!
 

asihiz

New member
ננסה...

יש לך קצת בלבול חשיבתי... מה שאת רוצה בעצם לעשות זה שתי פעולות במקביל(טיימר+האזנה לאירועים),הדרך היחידה שלך כמתכנתת ליצור פעולות במקביל זה יצירת threads,כאשר את יוצרת thread אחד להאזנה ו-thread אחד לטיימר,הם ירוצו במקביל עד לסיום פעולתם,ש-thrad ההאזנה יחכה לאירועים והשני ירוץ בזמן הטיימר.את יכולה לשחק איתם עם(sleep,wait,notify,notiftAll),ובצע סינכרון (syncronyzed),אך את צריכה להכיר את הנושא. אין לך אפשרות להרצת שני קטעים "במקביל"(כמובן שהמעבד אף פעם לא מריץ שני תהליכים בו זמנית),אם תנסי את הרעיון שהצעת עם המשתנה הבוליאני מה שיקרה זה שהתןכנית תרוץ באופן סדרתי,קודם כל הטיימר יגמר ורק אז עקב שינוי המשתנה הבולאני התוכנית הראשית תפנה להאזנה. כל השימוש שלך בהגדרה "איך אני יודעת שתהליך מסתיים" היא מוטעה,או שבריצה סדרתית רץ תהליך ואז אחר,או ריצה במקביל(לגבי זמני ריצה של תהליך עניתי לך בהודעתי הקודמת). לגבי השאלה השלישית,מורכבות זה ענין יחסי,אך יצירת תהליכים היא בהחלט דבר כבד יחסית. אם יש לך עוד שאלות אני פה בשביל לעזור...
 
למעלה