הדבקה ל – Clipboard מתוך Timer – תיקון Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.

יום חמישי, פברואר 4, 2010

  נניח שאתם כותבים קוד כזה.   System.Threading.Timer timer =     new System.Threading.Timer(callbacb, null, 1000, 5000);   private void callbacb(object state) {     Clipboard.SetData("text", "abcd"); }     הפרמטר הראשון זה המתודה להפעלה, השני זה פרמטר לפונקצייה, השלישי כמה זמן לחכות לפני הפעימה הראשונה, והאחרון הינו ה - interval.   בכל מקרה הקוד יעיף שגיאה:   Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.   מכיוון שה - Timer רץ ב - Context שלא מוגדר כ - STA.   במידה ואתם עובדים ב - WinForm application. אפשר פשוט לעבוד עם Timer של System.Windows.Forms או ב - Timer של...
תגיות: , , , ,
2 תגובות

Update gui controls from other thread

יום חמישי, ינואר 1, 2009

  באחד הפוסטים הראשונים כתבתי על דרך לעדכן controls מתוך thread אחר. אני שוב אדגים כאן את הבעייה בקצרה, אם ננסה להריץ את הקוד הבא:     1 private void button1_Click(object sender, EventArgs e)     2 {     3     Thread t = new Thread(new ThreadStart(target));     4     t.Start();     5 }     6      7 private void target()     8 {     9     this.Text = "ddddd";    10 } נקבל את השגיאה הבאה:       כמובן שההסבר הוא פשוט, בגלל ענייני Security אסור לשנות Gui של controls שנוצרו ב thread אחר.   אז יש כמה וכמה שיטות להתגבר על זה, מקודם מצאתי שיטה חדשה (ונהדרת) להתגבר על זה. אם לא מעניין אותנו ה Security בנקודה הזאת. אפשר להגדיר ל CLR להתעלם משגיאות מהסוג הזה, איך ? לכל Control יש מאפיין סטטי שנקרא CheckForIllegalCrossThreadCalls, שאשפשר להגדיר...
תגיות: , ,
3 תגובות

Update gui controls without MethodInvoker (SynchronizationContext)

יום חמישי, נובמבר 13, 2008

שלום לכל הקוראים. חבר שלי, שי קרן, הראה לי class חדש שלא הכרתי  בשם SynchronizationContext אני רוצה שנכיר את אחד מהשימושים של ה Class הזה. נחשוב על הסיטואציה הבאה: יש לנו מתודה בתוך Form שתפקידה לכתוב על Label את התאריך.      1     private void UpdateLabel()    2     {    3         label1.Text = DateTime.Now.ToLongTimeString();    4     } ואנחנו מפעילים אותה מתוך Thread אחר        1     private void WorkWithThread_Click(object sender, EventArgs e)    2     {    3         Thread thread = new Thread(delegate()    4         {    5             UpdateLabel();    6         });    7     8         thread.Start();    9     } מה שיקרה בפועל, שהאפליקצייה תתרסק עם ה Exception הבא:   Cross-thread operation not valid: Control 'label1' accessed from a thread other than the thread it was created on הסבה לכך היא, שאנחנו מנסים לעדכן Control...
תגיות: ,
6 תגובות