java onclicklistener - לא מציג דבר עד לסיום

java onclicklistener - לא מציג דבר עד לסיום

הפקודה.

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

כלומר, אם ב-onclicklistener קודם כל יש פקודה של JLabel.setText("foo") ולאחריו יגיע הקוד הארוך, אז עד לסיום הקוד הארוך, לא יופיע לי על המסך ב-JLabel אותו foo שביקשתי להציג.
כלומר הוא יחכה עד לסיום התהליך ורק לאחריו יציג הכל.

איך אפשר בכל זאת להתגבר על הבעיה הזו?
תודה.
 

BravoMan

Active member
הקוד שב-OnClickListner רץ על ה-thread של ה-UI

(ה-thread הראשי בד"כ) ולכן לא יתבצע שום עדכון של הממשק עד שה-thread יתפנה לטפל ב-event של העדכון (כלומר יסיים עם ה-event של הלחיצה).

למעשה, תגלה שכל הממשק שלך תקוע.

אם יש לך קוד שרץ זמן רב, עליך לשים אותו ב-thread נפרד.
 
אגב, האם גם בC# המצב הוא דומה?

כלומר האם גם בC# (או בשפות אחרות) יש את ה"מגבלה" הזאת?

תודה.
 

nocgod

New member
נראה לי בכל שפה יש את המגבלה הזאת

וזה גם הגיוני
אם אתה מריץ לוגיקה כבדה על הthread הראשי הלא הוא הUI thread איך ה UI יוכל להגיב?
אני מכיר יחסית סבבה ג'אווה ו #C ובשתיהם אתה צריך להריץ לוגיקה על thread נפרד על מנת שהUI לא יקפא
יותר מזה, יש דברים שאתה פשוט לא יכול להריץ על UI thread כמו תקשרות אינטרנט - דבר כזה מפיל את התוכנה בזמן ריצה אוטומטית
בפיתוח אנדרואיד העיקרון הזה עוד יותר נוקשה כי ברגע שהתוכנה שלך לא מגיבה מערכת ההפעלה מציעה למשתמש לחסל אותה, ואם זה יותר מכמה שניות מערכת ההפעלה מחסלת את התוכנה בעצמה.
 

BravoMan

Active member
זה לא קשור לשפה, זה קשור לצורה הבסיסית

שבה מחשב מריץ תוכנה:
מחשב יודע רק דבר אחד: להריץ את התוכנה בצורה לינארית - פקודה אחר פקודה.

אין לו דרך קסומה להציג לך חלון, ולהגיב לכפתורים.

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

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