שאלת threading

jhammer

New member
שאלת threading

יש לי Windows Forms Application, ואני צריך לבצע חישובים די מסובכים ברקע. לצורך כך יצרתי class שבו יש פונקציה המפעילה את פונקציית החישוב בתוך thread נפרד. בעוד הפונקצייה מחשבת, התוכנית ממשיכה לרוץ. כאשר החישוב מסתיים, ה-GUI מושפע בהתאם. הקפדתי לא לקרוא לשום פונקצייה אחרת מתוך ה-thread (אגב פונקציית החישוב היא רקורסיבית - אבל אני לא פותח threads מפונקציית החישוב). שאלה 1: איך אני יכול לדעת בוודאות שה-thread נסגר ושאני לא עדיין ב-context של ה-thread? שאלה 2: בשלב מסויים אני מעוניין ליצור controls חדשים ולשחרר controls ישנים. אני מקבל Exception שההודעה שלו היא: Controls created on one thread cannot be parented to a control on a different thread. איך נמנעים מההודעה?
 

idoamrani

New member
תשובה

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

jhammer

New member
אין Property בשם ID ל-Thread

כמו כן מהי הפקודה שסוגרת את ה-Thread? לפי מיטב הבנתי לא ניתן לסגור thread ב-.net בצורה ישירה ומיידית
 

sharkyM

New member
threading

התייחסות לשאלה 2. אתה אכן לא יכול לבצע פעולות על ה-form שקרא ל-class, מכיוון שהם בשני threads שונים. מה שאתה כן יכול לעשות (ומומלץ) זה להעביר את הinstance של הform ל-class, ולקורא למתודות שלו שמבצעות את מה שאתה רוצה.
 

jhammer

New member
לא מעוניין להעביר את ה-form ל-class

זאת מכיוון שה-class הנ"ל מבצע רק חישובים ואני לא מעוניין לערבב בכך את ה-GUI (זה נחשב bad design) יתרה מזאת, ה-thread אמור להסתיים כאשר החישוב מסתיים. כאשר החישוב מסתיים אני מעוניין לעורר event בצורה כלשהי, כך שה-thread הראשי יבין שעליו להפעיל את ה-GUI.
 

Itay20VT

New member
זה לא ממש נכון...

זה שהוא יעביר מצביע של ה- FORM ל- CLASS לא יפתור את בעיית הוספת הקונטרולים החדשים. הבעיה עדיין תישאר כיוון שמדובר בשני THREADS שונים. ולכן, על מנת לפתור זאת יש לבצע שני דברים: 1. לשמור מצביע ל- FORM, או לפקד שאליו רוצים להוסיף פקדים נוספים. 2. להשתמש במתודה בשם INVOKE או BEGININVOKE - פתח MSDN ולמד איך מתודה זו עובדת. בגדול אני יכול לומר לך שאתה צריך להריץ את מתודת INVOKE על ה- CONTROL שרוצים לעדכן, לדוגמא, אם יש לנו FORM שאליו אנו רוצים להוסיף BUTTONS למשל מ- THREAD אחר, אז דבר ראשון, נשיג מצביע ל- FORM שיישמר ב- THREAD השני (זה שמבצע פעילות ברקע), וכשנרצה להוסיף את הפקדים, נפעיל את מתודת INVOKE של ה- FORM ונשלח לה DELEGATE (שהוא דומה למצביע לפונקציה) לפונקציה שתטפל בהוספה. הפונקציה ששלחנו כפרמטר תפעל בסביבת ה- THREAD של ה- FORM והפקדים יתווספו. זו הדרך הבריאה והנכונה לביצוע הפעולה. ניתן לבחור בשני אופני עבודה, סינכרוני או אסינכרוני (INVOKE או BEGININVOKE). מקווה שזה פותר את הבעיה ומקדם אותך. איתי.
 

sharkyM

New member
הוספה

לשמור מצביע ל-form , היינו הך כמו להעביר את ה-form ל- class. - אין ספק שאתה השקעת יותר בפירוט התשובה...
 

Itay20VT

New member
ברור, אבל העברת מצביע

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