זקוק להדרכה קצרה על CROSS THREADING - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

זקוק להדרכה קצרה על CROSS THREADING


noam25

Recommended Posts

שלום לכולם,

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

השגיאה שאני מקבל מדברת על זה שהלייבל נוצר כתרד אחר ואני מבקש לשנות אותו מהתרד שיצרתי CROSS THREAD OPERATION .

אני כותב בסי # אשמח להסבר קצר איך אני מתגבר על זה.

תודה חברים .

קישור לתוכן
שתף באתרים אחרים

בתוך התרד שלי מתבצע מעבר על כל הקבצים במערכת . לכל קובץ אני יכול לקחת מידע כללי. ב-UI שלי יש לייבל שכל פעם יציג את המסלול הנבדק .

(זהה לריצה של SCANDISK או אנטיוירוס)

השאלה אם אני יכול לשלוח את הפרמטר הזה מהתרד ל-EVENT ב-UI .

??

אשמח לעוד עזרה

קישור לתוכן
שתף באתרים אחרים

למעשה, רק ליצור אירוע (event) לא יעזור, כי טיפול באירועים מתבצע באותו ת'רד כמו מי שקרא להם.

צריך לומר במפורש לת'רד של ה-GUI לעבוד. הדרך לעשות את זה היא באמצעות InvokeRequired+Invoke. דוגמאות יש כאן:

http://msdn.microsoft.com/en-us/library/ms171728.aspx

העיקר כאן הוא המתודה SetText.

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

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

קישור לתוכן
שתף באתרים אחרים

תודה רבה על התגובה .

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

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

אשמח לעוד קצת הכוונה

תודה רבה.

קישור לתוכן
שתף באתרים אחרים

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

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

קישור לתוכן
שתף באתרים אחרים

שוב תודה אחי .

אז בעצם אני יוצר אובייקט מתווך בין התרד ללייבל בGUI ??

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

קישור לתוכן
שתף באתרים אחרים

אז בעצם אני יוצר אובייקט מתווך בין התרד ללייבל בGUI ??

יש כל מיני דרכים. יש אובייקט כלשהו שמבצע את המעבר על הקבצים, נכון? ואני מניח שהאובייקט הזה נוצר איפשהו ב-form שלך, ומשם קוראים לפונקציה שלו שמבצעת את המעבר עצמו, נכון? אז מה שצריך לעשות הוא להוסיף לאובייקט הזה event שמדווח על שם הקובץ (זה אירוע שמעביר פרמטר אחד - שם הקובץ הנוכחי). לפני הקריאה לפונקציה, ה-form צריך לרשום פונקציה לטיפול באירוע הזה. הפונקציה הזו צריכה להשתמש ב-Invoke כמו בלינק שנתתי קודם.

אתה לא חושב שיצירת טיימר לעדכון הלייבל כל זמן מסויים ייצור גם עומס מסויים בGUI ?

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

קישור לתוכן
שתף באתרים אחרים

בלבלת אותי קצת עכשיו .

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

עכשיו מה בדיוק אתה אומר שאני צריך לעשות?

קישור לתוכן
שתף באתרים אחרים

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

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

(בעתיד, אגב, מומלץ להפריד את העסק לשני אובייקטים נפרדים).

קישור לתוכן
שתף באתרים אחרים

לגבי ה-invoke, כל מה שאתה צריך מופיע בלינק.

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...