עבור לתוכן

טופס C# קופא לאחר לחיצת כפתור - Windows Form.

Featured Replies

פורסם

    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 עד שיחזור חיבור האנטרנט כנראה תוקעת את זה איכשהו.

מה לדעתכם הבעיה?

פורסם

אתה צריך ת'רדים.

מה שאתה עושה בפועל זה לקחת את הת'רד הראשי שלך (של ה-GUI) ולעשות איתו כל מיני דברים כמו while.

עכשיו הת'רד הזה תפוס אז אין לו 'זמן' להתעסק עם הממשק ועד שהוא לא יסיים את העבודה (קרי: הפונקציה button1_Click) הממשק יישאר קפוא.

בגדול אתה צריך ליצור ת'רד חדש בתוך הפונקציה של לחיצת הכפתור ולהפעיל דרכו את הלוגיקה של התוכנה.

פורסם
  • מחבר

אתה צריך ת'רדים.

מה שאתה עושה בפועל זה לקחת את הת'רד הראשי שלך (של ה-GUI) ולעשות איתו כל מיני דברים כמו while.

עכשיו הת'רד הזה תפוס אז אין לו 'זמן' להתעסק עם הממשק ועד שהוא לא יסיים את העבודה (קרי: הפונקציה button1_Click) הממשק יישאר קפוא.

בגדול אתה צריך ליצור ת'רד חדש בתוך הפונקציה של לחיצת הכפתור ולהפעיל דרכו את הלוגיקה של התוכנה.

תוכל לכוון אותי לפעולות הספציפיות שאני צריך לבצע עם הThreads, בבקשה?

פורסם

יש המון דרכים לעבוד אם ת'רדים ב-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 ולקרוא להן... אם אין לך מושג מה אמרתי, וזה לא עובד לך אז תגיד ואני אראה לך.

בהצלחה :xyxthumbs:

פורסם

רק שחבל שמתוך Thread אחר אתה לא יכול לגעת ב-GUI ולכן הפקודה label1.Text = getExternalIp() תתחרפן.

צריך לעשות את זה עם InvokeRequired ו-BeginInvoke

http://kristofverbiest.blogspot.com/2007/02/simple-pattern-to-invoke-gui-from.html

נכון, אי אפשר לגעת ב-GUI ולכן השתמשתי ב-beginInvoke בקוד שהראיתי פה.

או שאני מפספס פה משהו?

פורסם

יש עטיפה ממש יפה שעשו ב- .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 בזמן ביצוע הלולאה.

ארכיון

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

דיונים חדשים