פורסם 2009 ביוני 1616 שנים private void button1_Click(object sender, EventArgs e) { if (CheckInet()) { bool internetcheck = false; string url = "[url]http://192.168.1.254/cgi-bin/dial?rc=@&A=H0&rd=status";[/url] WebClient wc = new WebClient(); wc.OpenRead(url); while (!internetcheck) internetcheck = CheckInet(); label1.Text = getExternalIp(); } }אני מנסה לעשות התחברות מחדש דרך הראוטר שלי למודם שלי.ההתחברות מחדש עובדת כלומר שwc אכן קורא את הurl ופה לא הבעיה,הלולאת while שעשיתי כדי שתעכב את שינוי הIP בlabel1 עד שיחזור חיבור האנטרנט כנראה תוקעת את זה איכשהו.מה לדעתכם הבעיה?
פורסם 2009 ביוני 1616 שנים אתה צריך ת'רדים.מה שאתה עושה בפועל זה לקחת את הת'רד הראשי שלך (של ה-GUI) ולעשות איתו כל מיני דברים כמו while.עכשיו הת'רד הזה תפוס אז אין לו 'זמן' להתעסק עם הממשק ועד שהוא לא יסיים את העבודה (קרי: הפונקציה button1_Click) הממשק יישאר קפוא.בגדול אתה צריך ליצור ת'רד חדש בתוך הפונקציה של לחיצת הכפתור ולהפעיל דרכו את הלוגיקה של התוכנה.
פורסם 2009 ביוני 1616 שנים מחבר אתה צריך ת'רדים.מה שאתה עושה בפועל זה לקחת את הת'רד הראשי שלך (של ה-GUI) ולעשות איתו כל מיני דברים כמו while.עכשיו הת'רד הזה תפוס אז אין לו 'זמן' להתעסק עם הממשק ועד שהוא לא יסיים את העבודה (קרי: הפונקציה button1_Click) הממשק יישאר קפוא.בגדול אתה צריך ליצור ת'רד חדש בתוך הפונקציה של לחיצת הכפתור ולהפעיל דרכו את הלוגיקה של התוכנה.תוכל לכוון אותי לפעולות הספציפיות שאני צריך לבצע עם הThreads, בבקשה?
פורסם 2009 ביוני 1716 שנים יש המון דרכים לעבוד אם ת'רדים ב-C#, כל מיני 'עטיפות' למיניהן אז שווה להתעמק קצת בגוגל/msdn בשביל להבין יותר. הדרך הכי ישירה: private void button1_Click(object sender, EventArgs e){ button1.Enabled = false; Thread thread = new Thread(delegate(){ bool internetcheck = false; string url = "[url]http://192.168.1.254/cgi-bin/dial?rc=@&A=H0&rd=status";[/url] WebClient wc = new WebClient(); wc.OpenRead(url); while (!internetcheck) internetcheck = CheckInet(); if (this.InvokeRequired) { this.BeginInvoke(new MethodInvoker(delegate() { label1.Text = getExternalIp(); button1.Enabled = true; })); }}); thread.Start();} יש פה שימוש ב-Anonymous Methods - זה אמור לעבוד החל מ-C# 2.0 אז אם יש לך גירסה ממש ממש ישנה זה לא יעבוד ככה, תצטרך להפוך את כל המקומות עם ה-delegates לפונקציות אמיתיות וליצור להן delegates ולקרוא להן... אם אין לך מושג מה אמרתי, וזה לא עובד לך אז תגיד ואני אראה לך. בהצלחה
פורסם 2009 ביוני 1816 שנים רק שחבל שמתוך Thread אחר אתה לא יכול לגעת ב-GUI ולכן הפקודה label1.Text = getExternalIp() תתחרפן.צריך לעשות את זה עם InvokeRequired ו-BeginInvokehttp://kristofverbiest.blogspot.com/2007/02/simple-pattern-to-invoke-gui-from.html
פורסם 2009 ביוני 1816 שנים רק שחבל שמתוך Thread אחר אתה לא יכול לגעת ב-GUI ולכן הפקודה label1.Text = getExternalIp() תתחרפן.צריך לעשות את זה עם InvokeRequired ו-BeginInvokehttp://kristofverbiest.blogspot.com/2007/02/simple-pattern-to-invoke-gui-from.htmlנכון, אי אפשר לגעת ב-GUI ולכן השתמשתי ב-beginInvoke בקוד שהראיתי פה.או שאני מפספס פה משהו?
פורסם 2009 ביוני 2016 שנים יש עטיפה ממש יפה שעשו ב- .net כדי לאפשר קריאות ל- threads נפרד, עם עדכוני guiזה נקרא background worker:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspxעוד אופצייה, הרבה יותר קלהלעשות את הלולאת while while (!internetcheck){ internetcheck = CheckInet();Thread.Sleep(500);Application.DoEvents;}זה גורם ללולאה לעשות sleep של חצי שניה בכל מחזור, ולאחר מכן doevents. doevents בעצם גורם ל gui לבצע את כל ה events שמחכים אצלו לזמן cpu.ה- sleep נועד כדי למנוע 100% cpu בזמן ביצוע הלולאה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.