פרויקט foraging חלק ג'

מועד הגשה: 07.01.11

בחלק זה של התרגיל עליכם לצרף GUI לפרויקט ולהתמודד עם מס' שינויים.

אתם נמדדים בעיקר על היכולת של ה design שלכם להכיל את ה GUI ואת השינויים בצורה החלקה ביותר.

יש לכם יד חופשית בכל הקשור לקוד ו design כאשר עליכם לעמוד בהנחיות הבאות

1. פונקציית ה main תקבל פרמטר – מספר המשתמשים (יהיה גדול מאפס)

2. לכל משתמש נפתח חלון console (שמחליף את הכתיבה \ קריאה ל  STD output/input)

המחשה:

את שורות הקלט \ פלט  יש לערום בשדה הגדול כפי שהן נערמות בכל console (כל שורה חדשה דוחפת למעלה את השורות שקדמו לה)

השדה הגדול מתפרס על פני כל השטח הפנוי שבחלון וגדל \ קטן עמו.

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

השתמשו ב GridLayout עבור החלון, (חישבו על מס' התאים הדרוש)

וכן ב …)setLayoutData(new GridData לכל widget. שימו לב שיש מס' CTORים הכניסו פרמטרים שקובעים כמה תאים לתפוס, ועד להיכן להתפרס.

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

הפרוטוקול זהה לתרגיל הקודם פרט לשינויים המפורטים בהמשך.

3. הפקודה show GUI תגרום להופעה של חלון נוסף שמציג את הסימולציה, חלון זה יכול להופיע רק פעם אחת, והוא תמיד מציג את מצב הסימולציה.

הפקודה close GUI תגרום לו להסגר (הסימולציה יכולה להמשיך לרוץ בינתיים… ואם נפתח את החלון שוב נראה את המצב המעודכן).

המחשה לצורת החלון:

הכפתורים במעלה החלון מהווים כפתורי שליטה בסימולציה בדומה לפקודות מהתרגיל הקודם, כאשר:

restart – גורם לפתיחת חלון דיאלוג של פתיחת קובץ – עבור קובצי XML, כאשר משם נטענת קונפיגורציה חדשה והסימולציה מתחילה מייד ע"פ קונפיגורציה זו.

על הכפתורים להיות זמינים ללחיצה רק בעת הצורך, למשל אם לחצנו על pause רק continue זמין.

מתחת לכפורתים ומתפרס על כל השטח הפנוי נמצא canvas שעליו תהיה מצוירת הסימולציה.

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

הנק' 0,0 הינה הפינה השמאלית עליונה של ה canvas וכן של הסימולציה.

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

4. רק בזמן שהסימולציה רצה, על ה canvas להתרענן בקצב מתאים כך שיציג את תנועת מחפשי המזון.

ציורים:

האוכל יראה כעיגול (מעגל מלא) אדום ברדיוס 3 פיקסלים מסביב ל x,y שלו, וכן הצבע שלו יהיה יותר אדום ככל שה gain שלו קרוב יותר ל 10.

ניתן להשתמש במופע של Color שמקבל ערכים של RGB שאלו הם ערכים עבור Red ,Green, Blue בין 0-255

(כשהכחול והירוק שווים 0, אז הצבע הופך לאדום יותר ככל שהערך של האדום מתקרב ל 255)

מלקט המזון יראה כמעגל (לא מלא) שחור ברדיוס 5 מסביב ל x,y שלו. (שחור זה הצבע הדיפולטיבי ל forground)

סרטון המחשה:

5. שינויים נוספים:

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

כמו כן, ניתן לשלוט בקצב הריענון גם כשהסימולציה רצה.

(עדיין לא ניתן לשנות נתוני אתחול אחרים כמו גודל מגרש)

6. הודעת שגיאה

תכולו לבחור או להציגן כ message boxes או לאגד אותן בחלון אחר שמתחזק לוג של הודעות שגיאה (יותר נוח למשתמש)

7. שימו לב שאם ה design שלכם טוב,  אז

  • לא נמצא אצלכם קוד כפול באף מקום… (בעיקר בדרכים השונות ליזום פקודות בסימולציה)
  • ההוספה של מס' משתמשים וההחלפה של ה console ב GUI console לא תהיה דרמתית כלל. (כן צריך לתת את הדעת על מס' פקודות שניתנו באותו הזמן)
  • כמו כן, שינוי קצב הרענון או ההוספה המיידית של מאכל או מלקט מזון תוך כדי ריצת הסימולציה – לא דרשו מכם שום שינוי בקוד.
  • שינוי המיקום של הודעות השגיאה נעשה במקום אחד בלבד בקוד

עליכם לצרף מסמך שמתאר את כל השינויים שהיה עליכם לבצע בתרגיל זה בקוד וב design (לא לתאר הוספה של GUI אלא דברים מהותיים)

השאיפה היא שלא הייתם צריכים שינויי design אלא רק שינויים של קוד במקום המיועד לתחזוק, אך אם זה בכל זאת קרה,

תראו לנו שלמדתם מזה משהו.

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

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

בהצלחה!

  1. אבנר
    23/12/2010 ב- 17:44

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

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

    ג. פקודת כמו של הפעלת הסימולצייה יעשו רק ע"י הכפתורים או גם ע"י החלון עם השורת פקודה?

    • 23/12/2010 ב- 20:59

      א. כולם שולטים באותה הסימולציה.
      ב. רק מה שאוטומטי – טענית ה XML והקבצים שהוא הגדיר ומייד רצים, זה שקול למה שהיה קודם בפקודת load
      שיציר דף ריק ועליו טען את הנתונים אוטומטית, אלא שהפעם מייד מתחילים את הסימולציה ולא מחכים לאתחול נוסף
      ג. גם וגם

      • אליעד
        30/12/2010 ב- 16:50

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

  2. אליעד
    24/12/2010 ב- 20:33

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

  3. ronyb85
    25/12/2010 ב- 09:20

    בעיה במעבר מ-Windows ל-Linux:

    אני עובד ב-eclipse ב-Windows 7 ושם יצרתי את חלון ה-console שבו אם מקלידים טקסט בשורה התחתונה ואז מקישים על enter, הטקסט מועבר לתיבת הטקסט הגדולה שלמעלה. ב-Windows זה עובד לי חלק, אבל כאשר ניסיתי להריץ את אותה התוכנית ב-Ubuntu שהתקנתי בתוך VirtualBox, זה לא עובד (החלון של ה-console מוצג אבל אין תגובה לשום event). גם דברים נוספים כמו שינוי גודל החלון שאמור לגרום להתרחבות או היצרות של שדות הטקסט עובדים לי חלק ב-Windows אבל ב-Ubuntu זה לא עובד. כמו כן ניסיתי להריץ את התוכנית שלי ב-Windows XP שמותקן ב-VirtualBox וגם שם זה עובד חלק, לעומת Ubuntu ששם זה לא עובד טוב.

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

    • ronyb85
      25/12/2010 ב- 12:11

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

  4. אליעד
    25/12/2010 ב- 11:34

    אני לא מצליח להוסיף את SWT כפי שמצויין במצגת התרגול.
    אין Eclipse home כשאני מגיע לשלב הזה.

    • אליעד
      25/12/2010 ב- 11:47

      אוקיי זה עובד אם עושים:
      Project – Properies – JavaBuildPath – Libraries – Add external JARs
      ואז בחלון שנפתח להיכנס לתיקייה של אקליפס ומשם לתיקיית הפלאג-אינס. שם לבחור את הקובץ המתאים.

  5. לאה
    25/12/2010 ב- 15:35

    התעריך הגשה הוא יום שישי…. המערכת של האוני' נסגרים אם אני לא טועה שעתיים לפני שבת? … אז עד מתי ההגשה?

    • 25/12/2010 ב- 16:08

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

      אז ליתר ביטחון אני קובע לכם כעת ששעת ההגשה היא עד 12:00 בצוהריים.

      תגישו בזמן, אני אקבל את כל התרגילים שיוגשו דרך המערכת (גם אחרי 12),
      אבל מי שיגיש אחרי 12:00 לוקח את הסיכון שלא יהיה לו איך להגיש, ולא אקבל את התרגיל שלו אם הוא לא הוגש.

  6. אליעד
    25/12/2010 ב- 20:34

    האם השדה הגדול משותף לכל המשתמשים?
    כלומר, האם כל משתמש רואה את הפקודות שכולם מכניסים, או שכל אחד רואה רק את הפקודות שהוא הכניס?

    • 27/12/2010 ב- 14:05

      כל אחד רואה רק את הקלט שלו ואת התגובות עבורו, נא לא להמציא מעבר לכתוב בתרגיל…

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

  7. רויטל
    27/12/2010 ב- 13:49

    האם ניתן להוסיף מלקט לסימולציה שנמצאת בPAUSE?
    ואם מוסיפים מלקט לסימולציה שרצה לזמן מוגבל,הוא מקבל רק את הזמן הנותר?

    • 27/12/2010 ב- 14:07

      1. כן
      2. מהרגע שמלקט נכנס – והסימולציה רצה – אז הוא מסומלץ – כל עוד היא רצה.

  8. ronyb85
    27/12/2010 ב- 17:06

    האם עכשיו ה-Report אמור להיות מודפס אל תוך ה-Console?

  9. אבנר
    27/12/2010 ב- 20:09

    רק לוודא – נניח יש 5 משתמשים, אז בהרצת התוכנית נפתחים לי 5 חלונות שונים של ה-console?
    התוכנית נגמרת רק אחרי שאני סוגר את כל החמישה?
    (אפשרי להפעיל כל משתמש בתרד נפרד, או שעדיף לעשות את כולם באותו התרד, וכך לחסוך בליבות?)

    • 28/12/2010 ב- 15:26

      כן, וכן,

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

      • רויטל
        28/12/2010 ב- 22:38

        מה המשמעות של כמה ת'רדים בליבה אחת?

      • 28/12/2010 ב- 22:47

        משמעות תיאורטית בלבד,
        לו היה זה מחשב על עם כמה מעבדים ויכולת להקצות משימות למעבד,
        אז את כל המשתמשים ועדכון ה GUI הייתי שולח לאותו המעבד בת'רדים נפרדים.
        גם ככה רובם רוב הזמן מחכים ל IO אז הסימולציה מצטיירת בינתיים.

        שאר המעבדים היו עושים את החישובים (הכבדים – לצורך העניין) עבור הסימולציה.

      • אבנר
        30/12/2010 ב- 20:00

        לא הבנתי מדוע חשוב להפעיל כל חלון משתמש בתרד נפרד, הרי בכל מקרה הם פועלים במקביל. ומן הסתם מערכת ההפעלה כבר מקצה תרד לכל חלון.
        (עובדה שע"מ לעדכן את החלון אני צריך לפעול דרך התרד המתקבל מ-syncExec)
        לכן אם נקצה ידנית תרד לכל חלון, יהיה לנו בעצם שני תרדים לכל חלון!

      • אבנר
        31/12/2010 ב- 07:21

        מה שכתבתי שכל חלון מופעל ע"י מערכת ההפעלה בתרד נפרד, סליחה טעות שלי:
        http://book.javanb.com/swt-the-standard-widget-toolkit/ch05lev1sec7.html

        [אגב, זומבט יותר נוח…]

  10. dana
    28/12/2010 ב- 10:49

    האם החלון של הסימולציה צריך להיות ניתן להקטנה הגדלה??
    ואם כן הcanvas אמור לזוז בהתאם אליו? האם ניתן להגדיל ולהקטין את הלוח של הcanvas??
    הרי יש לו גודל קבוע, אז מה אנחנו אמורים לעשות??
    resizing? ואז תהיה לנו בעיה, כי בעיקרון, המסך הוא pixel perfect מבחינת המרחקים.
    או שנעשה slicing לחלון, ואז בעצם לא נראה את כל המסך, אבל הוא עדיין יהיה שם.
    (ומה בנוגע להגדלה?)

  11. אבנר
    28/12/2010 ב- 19:33

    אם יש לי משתנה שמחזיק את רשימת כל המאכלים (לדוגמא)
    אז אם אני רוצה למחוק את כולם, וליצור חדשים – מה עדיף:
    א. למחוק את הרשימה, ולהכניס מחדש לאותה רשימה חדשים.
    ב. לשמור במשתנה רשימה חדשה, ולהכניס לתוכה. ולסמוך על ה-gc שימחוק לי כבר את הרשימה הישנה.
    ?

    • 28/12/2010 ב- 22:43

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

  12. מאירית
    29/12/2010 ב- 09:18

    כשעושים redraw() לcanvas בתוך המתודה שאמורה לטפל ב show GUI, הוא לא נכנס לpaintControl שאמור לתפוס את הevent שredraw זורק. אני מניחה שזה בגלל שהוא מחכה לכל הת'רדים האחרים לסיים.. איך ניתן לפתור את זה?

    • 29/12/2010 ב- 14:33

      אני לא מבין לאלו ת'רדים את מתכוונת, אבל בכל אופן, redraw מפעיל את ה paint event ואם זה לא עובד אז תדבאגו

    • אבנר
      29/12/2010 ב- 19:54

      כשרוצים לצבוע חלון עם תרדים יש בעייה, צריך להשתשמש במשהו כזה:

      Thread operationThread = new Thread() {
      public void run() {
      display.asyncExec / syncExec(new Runnable() {
      public void run() {

      // UI Updating procedures go here …

      }
      });
      }
      };

  13. יוסף
    29/12/2010 ב- 17:41

    האם אנחנו רוצים שתהיה אפשרות להשתמש ב-CLI כמו שהוא מהתרגיל הקודם וגם לקלוט דברים ב-GUI במקביל? או שהקליטה מה-GUI מחליפה לחלוטין את ה-CLI של התרגיל הקודם וניתן לשנות מחלקות כמו CommandLine ?

    • 02/01/2011 ב- 18:36

      הקלט מגיע כעת רק מהחלונות, אולם הרעיון הוא שתוכל לעשות reuse לקוד שלך, עם ה design מאפשר…

  14. dana
    29/12/2010 ב- 18:29

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

    • אליעד
      29/12/2010 ב- 22:07

      קראי את תגובות 11, 12.

      • dana
        29/12/2010 ב- 22:48

        תודה

        אבל אני לא דיברתי על ה console של המשתמשים אלא על ההודעות שגיאה שניתן להציגן כ message boxes או לאגד אותן בחלון אחר שמתחזק לוג של הודעות שגיאה..

    • 30/12/2010 ב- 12:57

      איך שבא לכם, מה שנראה לכם הכי נוח למשתמשים

  15. אבנר
    29/12/2010 ב- 21:06

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

    • 30/12/2010 ב- 12:59

      או שאחד המשתמשים יעשה load או שייפתח את ה GUI…
      מה GUI ניתן לעשות restart שטוען קונפיגורציה, ואז גם ככה המגרש אמור להתאים את עצמו.

  16. maayan
    30/12/2010 ב- 10:53

    האם מותר לשנות את הCLI ואת המחלקות COMMANDLINE?
    בהתחשב בכך שאין צורך ביכולת להריץ את התרגיל כמו בחלק 2
    אלא רק בעזרת הGUI

    תודה

    • 30/12/2010 ב- 13:00

      כן, מותר לשנות, אם כי הגיוני שכל אחד מה consoles יחזיק מופע של CLI
      (שעבר התאמה)

  17. yaniv
    30/12/2010 ב- 12:14

    שאלה לגבי סיום "טבעי" של הסימולציה.

    עד עכשיו , סימולציה הסתיימה באחת מ-2 דרכים:
    1. נכנסה פקודת stop
    2. נגמר האוכל ולכן המלקטים סיימו את עבודתם ולכן משימות המלקטים הסתיימו.

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

    האם לפני ההגדרות החדשות של התרגיל , אין בעצם סיום טבעי של הסימולציה? כלומר רק בפקודת stop בעצם מסתיימת הסימולציה ובפקודת restat מתחילים סימולציה חדשה עם הגדרות קובץ הקונפיגורציה (כלומר כל ההוספות נעלמות מהסימולציה הקודמת נעלמות)

    אשמח לקבל הבהרות בעניין , תודה

    • 30/12/2010 ב- 13:03

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

      הסימולציה יכולה להגמר בעקבות STOP או לאחר הזמן שהוגדר לה לרוץ ע"י RUN

  18. ronyb85
    30/12/2010 ב- 13:16

    שוב בעיות במעבר ללינוקס:

    התוכנית שלי רצה היטב בגרסאות שונות של Windows, אבל כשאני מנסה להריץ אותה בלינוקס (אובונטו) אני מקבל את השגיאה הבאה:

    Exception in thread "Thread-0" org.eclipse.swt.SWTError: Not implemented [multiple displays]
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.widgets.Display.checkDisplay(Unknown Source)
    at org.eclipse.swt.widgets.Display.create(Unknown Source)
    at org.eclipse.swt.graphics.Device.(Unknown Source)
    at org.eclipse.swt.widgets.Display.(Unknown Source)
    at org.eclipse.swt.widgets.Display.(Unknown Source)

    ניסיתי למצוא לזה פתרונות ברשת, והגעתי לשאלה הזאת שמישהו שאל:
    http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg39438.html

    וזאת התשובה שהוא קיבל:
    http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg39439.html

    כלומר מה שנאמר שם זה שיש מערכות שלא תומכות בפתיחה של יותר מחלון אחד (doesn't support creation of multiple display) ואובונטו היא אחת מאלה מסתבר…

    השאלה שלי היא האם זה אמור להטריד אותי? האם התרגיל יבדק ב-Windows או במערכת הפעלה אחרת?

  19. opo
    30/12/2010 ב- 13:46

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

  20. אבנר
    30/12/2010 ב- 18:32

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

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

    • 02/01/2011 ב- 18:41

      אין הפעם הגדרה שצריך רק מופע אחד של CommandExecutor כלשהו…
      ניתן ליצור לו מופע חדש בכל בקשה, או מופע עבור הפרמטרים שצריך לקבל, כך או כך
      אינסטנס חדש פותר בעיות סנכרון כי כבר לא מדובר על אותו המשאב – במחיר של זיכרון

      • dana
        02/01/2011 ב- 19:52

        אז שוב, למה יש להכניס את הcommand לתור?
        למה כמו שאבנר אומר ליצור מופע חדש ולהפעיל אותו מידיית?

  21. רויטל
    30/12/2010 ב- 20:00

    Exception in thread "main" org.eclipse.swt.SWTException: Invalid thread access

    מה הexception הזה אומר?
    זה קורה כשמפעילים את הconsole בת'רדים.
    הבנתי שהמחלקה Display מפעילה ת'רד בעצמה, UI-thread.. אבל לא הבנתי בדיוק מה הבעיה

    http://www.eclipse.org/swt/faq.php#uithread
    SWT implements a single-threaded UI model often called apartment threading. In this model, only the UI-thread can invoke UI operations. SWT strictly enforces this rule. If you try and access an SWT object from outside the UI-thread, you get the exception "org.eclipse.swt.SWTException: Invalid thread access". Different operating systems have different rules governing threads, UI components and synchronization.

    • מיכאל
      31/12/2010 ב- 11:41

      אני בכלל לא מבין בשביל מה להריץ כל קונסול בת'רד משלו
      כשאני עושה ל open
      זה פשוט נפתח בחלון נפרד
      אז אם יש לי כמה קונסולים אז יש לי כמה חלונות
      איפה הת'רדים בדיוק נכנסים כאן לתמונה?

      • אליעד
        02/01/2011 ב- 23:49

        ומה אתה כותב בלולאת האירועים?

    • yaniv
      31/12/2010 ב- 12:02

      גם לי היה אותו דבר , מה שעשיתי זה להעביר את היצירה של הshell למתודת run ואז זה נפתר

  22. guy
    31/12/2010 ב- 00:31

    אפשר לקבל הסבר איך יוצרים InputStream שיחליף את System.in (שיקלוט את הקלט מהשדה טקסט של ב-Console)? ניסיתי לממש את InputStream ואת הפונק' read שלו ואני לא מצליח… אולי יש דרך יותר קלה לעשות את זה?

  23. עדי
    31/12/2010 ב- 10:14

    הבנתי שבמחלקה שמטפלת בGUI צריך להוסיף paintlistener לcanvas, שעושים לו redraw מאיזשהו ת'רד חיצוני לפי הrefresh rate. הבעיה שלי היא, אם הGUI צריך לתקשר עם מחלקת סימולציה דרך ה-CommandExecutors, איך הוא יכול לדעת מה הrefresh rate? הרי הexecute לא מחזירים כלום, ולהתחיל לשנות את כל הממשק והמתודות שכבר מימשתי נראה לי לא הגיוני.
    תודה

    • 02/01/2011 ב- 18:45

      מה הבעיה ש command כלשהו המפעיל מתודה אצל הסימולציה יקבל ערך חזרה, ואף יחזיר אותו אחורה אל מי שהפעיל אותו…
      כל הרעיון הוא שה command הוא דו כיווני כמתווך בין 2 השכבות השונות

      • עדי
        04/01/2011 ב- 22:53

        איך ה-command יחזיר אחורה משהו אל מי שהפעיל אותו? הרי אי אפשר לשנות את החתימה, האם הכוונה לזרוק exception עם מידע כלשהו..?!

  24. Renana
    31/12/2010 ב- 12:16

    לא ברור לי ואיפה יצרת את ה display??

  25. Eldad
    01/01/2011 ב- 13:00

    האם חובה לעשות ת'רד לכל משתמש ?
    או שאפשר ליצור מס' קונסולים על ת'רד אחד ועבורם לממש תור של פקודות ?

    • 03/01/2011 ב- 11:27

      תחשוב שניה אם יש לך לולאה אינסופית בתוך הקונסול של
      readanddispatch
      איך בדיוק התרד יצא מהלולאה הזאת ויתעסק עם קןנסול אחר…?
      קיצור צריך כמה תרדים אחד לכל קונסול

  26. יעל
    01/01/2011 ב- 17:02

    1) האם כשנטענת קונפיגורציה ריקה ע"י כפתור ה-restart אמורים להריץ סימולציה ריקה שרק מחכה שיכניסו לה מלקטים ומאכלים? או פשוט לזרוק שגיאה?
    2) כשאני לוחצת על restart, מהי הכתובת ההתחלתית שאמורה להיפתח (במסך שמציג את קבצי ה-XML הקיימים?)
    3) האם יש להגדיר את הקנבס טיפה מעל גודל המגרש(בערך 10) על מנת שנוכל לראות את המלקטים שנמצאים בנקודות הקיצוניות?

  27. יעל
    01/01/2011 ב- 21:43

    1) האם כשנטענת קונפיגורציה ריקה (שבה קובץ המאכלים ריק וקובץ המלקטים ריק) ע"י כפתור ה-restart אמורים להריץ סימולציה ריקה שרק מחכה שיכניסו לה מלקטים ומאכלים? או פשוט לזרוק שגיאה?
    2) כשאני לוחצת על restart מהי הכתובת ההתחלתית שצריכה להיפתח (במסך שמציג את קבצי ה-XML הקיימים)?
    3)האם יש להגדיר את הקנבס קצת מעל גודל המגרש(בערך ב- 10) על מנת שנוכל לראות את המלקטים שנמצאים בנקודות הקיצוניות?

  28. dana
    02/01/2011 ב- 10:59

    הבנתי שdisplay אחד זה בעייתי בכמה תרדים.
    ניסיתי למצוא באינטרנט מידע על זה.. ואני לא כל כך מבינה איך אמורים להתעסק עם זה
    וגם בנוגע ל shell שהם חייבים להיווצר במתודת הrun ואני לא מבינה למה רק כך זה עובד
    האם אוכל לקבל הסבר?

  29. ולדימיר
    02/01/2011 ב- 20:03

    האלן יש לי כמה שאלות.

    1. האם זה חוקי לטעון קובץ XML בזמן ריצה של הסימולציה? אם כן? אז צריך להוסיף את המלקטי המזון והאוכל שמהקבצים בזמן הסימולציה? יש איזה חוקיות בנושא?

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

  30. דוד
    02/01/2011 ב- 21:49

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

  31. 02/01/2011 ב- 21:53

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

  32. מתן
    03/01/2011 ב- 09:54

    שלום
    מספר שאלות:
    1. האם ההנחה בתרגיל הקודם שהפרמטרים של המלקטים והמאכלים בתוך הקבצים תקינים (כלומר שאתה לא תכניס אוכל במיקום שלא קיים בלוח שנטען לדוגמא)?
    2. האם צריך לטפל בסגירת ה – GUI ע"י איקס ואז גם לאפשר פתיחה מחדש (או שניתן להניח שה -GUI ייסגר רק ע"י הפקודה CLOSE GUI)?
    3. הבנתי כי הכוונה שלך בעידכון ה – GUI בקצב מתאים הוא לעדכן את ה- GUI לאחר שכל המלקטים ששייכים ל – FORAGERTASK ביצעו פעולה אחת (כלומר כולם ביצעו פעולה אחת ואז עידכון ה-GUI). האם הבנתי נכון?
    4. האם כוונתך במשפט "הפקודה close GUI תגרום לו להסגר (הסימולציה יכולה להמשיך לרוץ בינתיים… ואם נפתח את החלון שוב נראה את המצב המעודכן)." הוא שאני צריך לעדכן את ה- GUI במשך כל ריצת התוכנית ופשוט להפוך אותו לנראה ובלתי נראה לפעמים או שפשוט לעדכן את ה- GUI רק שהוא "פתוח" = קיים, ובמשך שאר התוכנית הוא יהיה סגור (כלומר אין למחלקה אינסטנס ברגעים אלו אך כמובן שאם פתיחת ה – GUI יוצג המצב העדכני של הסימולציה)?
    תודה מראש

  33. OPO
    03/01/2011 ב- 20:01

    האם אפשר להניח שסגירת הסימולציה בעזרת העכבר תתבצע רק לאחר stop או pause/continue ?
    כי אחרת זה יוצר בעיות שהתרד שמרענן את הקנאבס מנסה לגשת לdisplay שבעצם שוחרר, איך מתגברים על זה?

    • אבנר
      03/01/2011 ב- 20:55

      אתה יכול להשתמש בaddDisposeListener
      וב-deleteObserver

      • עדי
        04/01/2011 ב- 13:12

        איך משתמשים ב-addDisposeListener? כי ממה שהצלחתי להבין, ברגע שלוחצים על האיקס, הshell כבר disposed ורק אז נכנסים למתודה widgetDisposed.. אז אי אפשר "להציל" את מה שכבר יצרנו.
        מה אפשר לעשות במתודה הזו חוץ מלקרוא להכל להתאתחל שוב?.. (ואז אולי פשוט עדיף להריץ את GUI כשמבקשים וזהו).
        מקווה שזה מובן.. אשמח לתשובה

  34. אביב
    03/01/2011 ב- 21:18

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

    • 04/01/2011 ב- 00:51

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

      • יעל
        04/01/2011 ב- 18:19

        אמנם בגלל טעות נתת לנו חצי יום נוסף, אבל –

        1. מראש הזמן לתרגיל הזה הוא מאוד מאוד לחוץ, בייחוד בהתחשב בעובדה שזה סוף הסמסטר ויש לנו עומס רציני גם בכל שאר המקצועות.
        2. אני בטוחה שרובנו יעדיף להתחיל את התרגיל הבא ביום ראשון תמורת יום נוסף לתרגיל הנוכחי 🙂

        אז בבקשה תשקול זאת שוב, הלחץ של סוף הסמסטר באמת לא מאפשר לסיים את התרגיל כמו שצריך בזמן, וממש חבל.

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

  35. ליטל
    03/01/2011 ב- 23:45

    יש לי מופע יחיד (ע"י singelton) לcommand line ו-command line interpreter. האם ניתן להניח שלא יהיו 2 פקודות שיגיעו לcommand line במקביל? הרי זה לא ייקרה אף פעם מכיוון שמדובר על כמה משתמשים במחשב אחד

  36. לאה
    04/01/2011 ב- 04:11

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

  37. עדי
    04/01/2011 ב- 07:41

    שלום, שאלה לגבי report-
    האם אפשר במקום להדפיס אותו לתוך הקונסול, ליצור חלון עם הפירוט (כמו שעושים לשגיאות)?
    תודה

    • עדי
      04/01/2011 ב- 12:44

      לגבי השאלה שלי למעלה- כנ"ל לגבי ההודעה will use a max of … threads for foragers.

  38. לאה
    04/01/2011 ב- 13:02

    כשאני סוגרת את הSHELL עם הX של החלון הוא סורק לי EXCEPTION/// מישהו ידוע למה? או איך לטפל בזה? 🙂

  39. mic
    04/01/2011 ב- 18:41

    היי, רציתי לדעת האם מותר במקום לסגור את החלון של הSHOW GUI, לעשות לו setVisible(false)? (ואז זה למעשה כאילו היוזר סגר את החלון).

    • אבנר
      05/01/2011 ב- 18:36

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

      • גלעד
        06/01/2011 ב- 18:22

        תשתמש ב Daemon threads

  40. ארז
    04/01/2011 ב- 23:11

    בדוגמא הסימולציה מתחילה מיד עם טעינת קובץ הXML.
    זה אמור להיות ככה רק בלחיצה על רסטרט או גם באמצעות פקודת הטקסט
    load config….
    ?

  41. רויטל
    05/01/2011 ב- 08:46

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

    • ארז
      05/01/2011 ב- 09:28

      היית צריכה לשים לב לזה כבר בתרגיל הקודם. ברגע שאת משנה את מספר הפורג'רים אז פשוט את צריכה לחפש את הליבה הפנויה ולהוסיף אליה את הפורג'ר ולהפעיל בForagersTask חדש ואם אין ליבה פנויה אז לחפש את הליבה הכי פחות עמוסה, כלומר את הForagersTask עם הכי מעט פורג'רים מבין כל הForagersTask הקיימים, ולהוסיף אליו את הפורג'ר. במתודת הRUN של כל ForagersTask מריצים כל שניה ACT אצל כל הפורג'רים ולכן ברגע שנוסיף את הפורג'ר החדש גם הוא יתחיל לרוץ.

    • dana
      05/01/2011 ב- 18:31

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

  42. לאה
    05/01/2011 ב- 18:18

    ההדפסות של הליבות והדוח אפשר להדפיס אותם באותה חלון כמו של כל ה ERRORS? פשוט לשיהיה סוג של INFORMER וההדפסות של טעויות יהיה באדום וכל השער בשחור או שההדפסות האלו חייבים ליהיות בקונסול?

  43. לאון
    06/01/2011 ב- 12:06

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

  1. No trackbacks yet.

כתיבת תגובה