noam25 פורסם 2010 באוגוסט 4 Share פורסם 2010 באוגוסט 4 שלום לכולם,יש לי פונקציה שמבצעת מעבר רקוקסיבי על כל מערכת הקבצים במערכת . הפונקציה נקראת כתרד נפרד וכרגע מדפיסה פרטי קבצים לקונסול . אני מעוניין ליצור את התרד הזה בלחיצה על כפתור בטופס, ובמקום ההדפסה לקונסול אני רוצה הדפסה ללייבל שממוקם על הטופס .השגיאה שאני מקבל מדברת על זה שהלייבל נוצר כתרד אחר ואני מבקש לשנות אותו מהתרד שיצרתי CROSS THREAD OPERATION .אני כותב בסי # אשמח להסבר קצר איך אני מתגבר על זה.תודה חברים . קישור לתוכן שתף באתרים אחרים More sharing options...
Aurora Borealis פורסם 2010 באוגוסט 4 Share פורסם 2010 באוגוסט 4 צור איוונט בui שעושה את מה שאתה צריך, ושהת'רד יקפיץ את האיוונט כשצריך.ת'רד שהוא לא הgui לא יכול לגעת בui. קישור לתוכן שתף באתרים אחרים More sharing options...
noam25 פורסם 2010 באוגוסט 4 מחבר Share פורסם 2010 באוגוסט 4 בתוך התרד שלי מתבצע מעבר על כל הקבצים במערכת . לכל קובץ אני יכול לקחת מידע כללי. ב-UI שלי יש לייבל שכל פעם יציג את המסלול הנבדק .(זהה לריצה של SCANDISK או אנטיוירוס)השאלה אם אני יכול לשלוח את הפרמטר הזה מהתרד ל-EVENT ב-UI .??אשמח לעוד עזרה קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2010 באוגוסט 5 Share פורסם 2010 באוגוסט 5 למעשה, רק ליצור אירוע (event) לא יעזור, כי טיפול באירועים מתבצע באותו ת'רד כמו מי שקרא להם.צריך לומר במפורש לת'רד של ה-GUI לעבוד. הדרך לעשות את זה היא באמצעות InvokeRequired+Invoke. דוגמאות יש כאן:http://msdn.microsoft.com/en-us/library/ms171728.aspxהעיקר כאן הוא המתודה SetText.החסרון של זה, אגב, הוא שה-UI יגרום לאיטיות. בהנחה שהמעבר על הקבצים מהיר (נניח 100 קבצים בשנייה), תצטרך לעדכן את התווית 100 פעמים בשנייה - זה סתם יאט את התוכנה.אופציה אחת היא להפוך את ה-UI מפסיבי לאקטיבי - במקום להשתמש באירועים שמעדכנים את ה-UI, פשוט תחזיק את שם הקובץ הנוכחי באיזשהו משתנה שנגיש מה-UI (בתוך איזשהו אובייקט כלשהו), ואז שים טיימר שיעדכן את התווית כל כמה זמן (נניח כל עשירית שנייה). קישור לתוכן שתף באתרים אחרים More sharing options...
noam25 פורסם 2010 באוגוסט 5 מחבר Share פורסם 2010 באוגוסט 5 תודה רבה על התגובה .אם הבנתי נכון עדיף לי להשתמש באובייקט נוסף שאני שם איפה? בטופס? כי אז אם אני ארצה לעשות בו שינויים אני עלול גם לקבל שגיאת CROSS THREAD .הרי המעבר על הקבצים מתבצע בתרד אחר כך שרק בתרד הזה אני יכול לקבל את השם המלא של הקובץ. ואז רק להשתמש בו .אשמח לעוד קצת הכוונהתודה רבה. קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2010 באוגוסט 5 Share פורסם 2010 באוגוסט 5 קודם כל, להזכירך, לשום אובייקט אין "מקום". אובייקט פשוט מחזיקים התייחסויות לאובייקטים אחרים (ייתכן שבאופן לוגי אובייקט אחר "מכיל" אובייקט אחר, אבל באופן מעשי מדובר רק בהצבעה).אין בעיה להחזיק התייחסות לאובייקט בתוך הטופס, ולא תהיה בעיה לגשת אליו. מה שגורם לשגיאת ה-cross thread היא רק כשאתה מנסה לשנות משהו ב-GUI עצמו (כמו טקסט של תווית, לדוגמה). קישור לתוכן שתף באתרים אחרים More sharing options...
noam25 פורסם 2010 באוגוסט 5 מחבר Share פורסם 2010 באוגוסט 5 שוב תודה אחי .אז בעצם אני יוצר אובייקט מתווך בין התרד ללייבל בGUI ?? נשמע הגיוני וסביר . אתה לא חושב שיצירת טיימר לעדכון הלייבל כל זמן מסויים ייצור גם עומס מסויים בGUI ? קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2010 באוגוסט 5 Share פורסם 2010 באוגוסט 5 אז בעצם אני יוצר אובייקט מתווך בין התרד ללייבל בGUI ?? יש כל מיני דרכים. יש אובייקט כלשהו שמבצע את המעבר על הקבצים, נכון? ואני מניח שהאובייקט הזה נוצר איפשהו ב-form שלך, ומשם קוראים לפונקציה שלו שמבצעת את המעבר עצמו, נכון? אז מה שצריך לעשות הוא להוסיף לאובייקט הזה event שמדווח על שם הקובץ (זה אירוע שמעביר פרמטר אחד - שם הקובץ הנוכחי). לפני הקריאה לפונקציה, ה-form צריך לרשום פונקציה לטיפול באירוע הזה. הפונקציה הזו צריכה להשתמש ב-Invoke כמו בלינק שנתתי קודם.אתה לא חושב שיצירת טיימר לעדכון הלייבל כל זמן מסויים ייצור גם עומס מסויים בGUI ?למה שזה ייצור עומס? טיימר לא עושה כלום בזמן שהוא לא רץ. כל עוד תתן לו זמן השהיה שאינו קצר מדי (נניח עשירית שנייה) זה יהיה בסדר. קישור לתוכן שתף באתרים אחרים More sharing options...
noam25 פורסם 2010 באוגוסט 5 מחבר Share פורסם 2010 באוגוסט 5 בלבלת אותי קצת עכשיו .האמת היא שהפונקציה למעבר על הקבצים כתובה בטופס עצמו . היא נקראת בארוע לחיצה על כפתור בטופס בתרד נפרד .עכשיו מה בדיוק אתה אומר שאני צריך לעשות? קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2010 באוגוסט 5 Share פורסם 2010 באוגוסט 5 אוקי, אז כל העסק יותר פשוט. כיוון שהפונקציה יושבת בתוך הטופס, אז יש לה גישה לכל התוכן שלו.אז כל מה שצריך לעשות הוא שבמקום השורה שבה אתה משנה את הטקסט של התווית, שים פונקציה שתעשה את זה ותעבוד עם invoke.(בעתיד, אגב, מומלץ להפריד את העסק לשני אובייקטים נפרדים). קישור לתוכן שתף באתרים אחרים More sharing options...
noam25 פורסם 2010 באוגוסט 5 מחבר Share פורסם 2010 באוגוסט 5 מעולה.מקווה לא להגזים פה... תסביר לי קצת על הINVOKE הזה...ולמה עדיף להפריד את הפונקציה מהטופס? קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2010 באוגוסט 5 Share פורסם 2010 באוגוסט 5 לגבי ה-invoke, כל מה שאתה צריך מופיע בלינק.כי ככה עובדים object oriented. מפרידים בין חלקים שונים שיש להם מטרות שונות (אובייקט אחד למעבר על הקבצים, ואובייקט אחר להצגת ההתקדמות). כשמדובר על הפרדה בין לוגיקה להצגה, דרך נפוצה היא MVC. קישור לתוכן שתף באתרים אחרים More sharing options...
noam25 פורסם 2010 באוגוסט 5 מחבר Share פורסם 2010 באוגוסט 5 אחיהמון תודה . קישור לתוכן שתף באתרים אחרים More sharing options...
Recommended Posts
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.