שאלה..

Adidi70

New member
שאלה..

אני מנסה להוסיף פקדים דינמיים בתוכנית שלי מטופס - הבעיה היא שאני קורא לפונקציה שעושה את זה מתוך thread שונה (איך שה thread מסתיים אני קורא לפונקציה שתוסיף את הפקדים לטופס) וזה זורק לי שגיאה :
An unhandled exception of type 'System.ArgumentException' occurred in system.windows.forms.dll Additional information: Controls created on one thread cannot be parented to a control on a different thread.​
ניסיתי ליצור Delegate ולהשתמש בשיטה Invoke של הטופס אבל זה מייצר את אותה שגיאה. מישהו נתקל בבעיה ויודע מה עושים ?
 

Adidi70

New member
זה באמת כפשוטו...

אני נמצא בתוך פונקציה שנקראה ע"י Thread. בפונקציה יש לולאה מסוימת שמבצעת משהו - לאחר שהלולאה נגמרת אני מנסה להוסיף פקד Label ל panel שלי כדלהלן:
'VB: dim lbl as new Label() lbl.size = ... lbl.locataion = ... panel.Controls.add(lbl)​
ואז הוא זורק לי את השגיאה שלא ניתן להוסיף פקדים מThread אחד לפקד שנמצא ב Thread אחר.... (כמו שמצוין בהודעה המקורית)
 

nattygur

New member
אתה פשוט לא יכול לעשות את זה

By design, Windows Form or Control methods cannot be called on a thread other than the one that created the form or control. If you attempt to do this, an exception is thrown. Depending on the exception handling implemented in your code, this exception may cause your application to terminate. If no exception handling is implemented, the following error message is displayed: An unhandled exception of type 'System.ArgumentException' occurred in system.windows.forms.dll Additional information: Controls created on one thread cannot be parented to a control on a different thread. The exception is raised because Windows Forms are based on a single-threaded apartment (STA) model. Windows Forms can be created on any thread; after they are created, however, they cannot be switched to a different thread. In addition, the Windows Form methods cannot be accessed on another thread; this means that all method calls must be executed on the thread that created the form or control.​
ראה http://support.microsoft.com/default.aspx?scid=kb;en-us;318607
 

Adidi70

New member
יש לך רעיון מה אני כן יכול לעשות ?

אזשהוא טריק לעקוף את הבעיה הזו??
 

gilad g

New member
כשעבדתי על תפוזינה

היתה לי את אותה הבעיה בדיוק. כדי לפתור אותה השתמשתי ב-Invoke. מוזר שלך זה לא עובד
 

nattygur

New member
תנסה להסביר למה אתה רוצה להשתמש

ב Thread נפרד, מה הסיבה שגרמה לך לחשוב לעשות את זה ונחפש דרך לעקוף או לפתור את הבעיה. בדרך כלל לאותה בעיה יש מספר פתרונות ...
 

Adidi70

New member
בגדול מה שאני מנסה...

...לעשות עכשיו זה גם תחכום מסוים כדי להתגבר על בעיה קודמת - אז אולי אני אעלה את הבעיה הקודמת ותוכל לעזור - אני מצייר תמונה מסוימת על Panel בשיטת ה bltbit שהסברת (שיטה מעולה להעלמת ה Flickering תודה !) הבעיה היא שאני מצייר את התמונה הזו ב thread (אני יוצר תנועה של התמונה כמו שראית בדוגמאות ששמתי כאן קודם)- כלומר בפונקציה של ה Thread התמונה מצטיירת בלולאה אינסופית עם כיוון ה Sleep ל 1 ! (כל איטרציה של לולאה אני קורא לשיטה refresh של ה Panel שקוראת לארוע OnPaint ששם מתבצע הציור עצמו כמו שאתה ודאי יודע ותוך כדי אני משנה את מיקומו של הציור ליצירת התנועה) הבעיה היא שאני מנסה לבצע עוד ציורים של תמונות באותו Panel ככל שאני מצייר עוד ועוד תמונות ה Thread מאט את עצמו יותר ויותר (כאילו שהוא מתאמץ לצייר) - אומנם אין "הבהוב" או משהו כזה - אבל התנועה שאני מנסה ליצור מאטה את עצמה וזה פשוט הורס לי את התוכנית (אני בונה טטריס !! ) יש איזשהוא מאפיין שניתן לשלוט בו שה Thread יפעל האופן עצמאי ובאופן יציב ??? לא יודע אם זה אומר משהו - אבל אותו דבר עם Java זה עובד !! בתודה - מקווה שהבנת (אם לא אני תגיד לי אני אנסה לפשט עוד
)
 

nattygur

New member
ראשית

אני הייתי מבצע את זה עם Multi media timer. זהוא API אשר נועד בדיוק לצרכים האלו והרזולוציה שלו יותר קטנה מזה שמגיע עם ה VS. בנוגע ל Thread האם הוא מוגדר כ IsBackground? תבדוק גם לגבי Double Buffring זאת שיטה עוד יותר יעילה.
 

Adidi70

New member
אפשר עוד פרטים לגבי ה Multi media

מוגדר לי DoubleBuffer כן ! ומה זה IsBackground ולמה זה טוב ?
 

Adidi70

New member
חקרתי קצת ומצאתי...

שהמקבילה ה .net של ה multimedia timer זה ה System.Threading.Timer האם לזה התכוונת ? אני משתמש בזה וזה עדיין לא מספק את התוצאות הרצויות- ה Timer מאט עם הזמן כאשר הוא תלוי לחלוטין בכמות התמונות המצוירות על ה Panel ... האם תוכל להראות דוגמא למה שהתכוונת ?
 

Adidi70

New member
מצורפת התוכנית....

שוב - להפוך לזיפ ולפתוח כאן אפשר לראות איך התנועה מאטה עם הזמן !!
 

nattygur

New member
טוב אז ככה

1) לא אין תחליף Net. ל MM timer צריך להשתמש ב API. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_multimedia_timers.asp 2) אני חושב שהמאמר הזה מתאר את הטכניקה בצורה הכי טובה (זה לא ה Atribute): http://www.codeproject.com/cs/media/flickerFreeDrawing.asp 3) התבלבלתי IsBackground לא קשור לבעיה הזאת.
 

Adidi70

New member
המאמר שלך ל double Buffer מסורבל..

צריך לרשת מחלקה אחרת - (וזה כתוב רק ב C#) יש דרך הרבה יותר פשוטה להעלמת ה Flickering מובנית בטכנולוגיה וזה נכון לגבי כל שפה ממשפחת .net לגבי בעיית התנועה נראה לי שהבעיה שלי קשה מאוד לפתרון מכיוון שאני מתעקש על דיוק של מאית השנייה - אפשר לוותר על הדיוק הזה ואז הקוד יוצא הרבה יותר יציב והרבה יותר טוב תודה בכל אופן
 
למעלה