private void Pingtest(object obj) { MutipleThreadResetEvent resetEvent = (MutipleThreadResetEvent)obj; IPAddress myIP = IPAddress.Parse("120.77.134.57"); Ping pingSender = new Ping(); PingOptions options = new PingOptions(); options.DontFragment = true; string data = "F**k You Gaode"; byte[] buffer = Encoding.ASCII.GetBytes(data); int timeout = 3000; for (int a = 0; a <= 4; a++) { try { PingReply reply = pingSender.Send(myIP, timeout, buffer, options); if (reply.Status == IPStatus.Success) { SetTextBox("服务器连接成功,网络延迟为:" + reply.RoundtripTime + "\r\n"); pingtestpass = true; resetEvent.SetOne(); return; } else { SetTextBox("第" + (a + 1).ToString() + "次连接地图更新服务器失败:" + reply.Status.ToString() + "\r\n"); if (a == 4) { SetTextBox("地图服务器无法连接。请检查网络状态。\r\n"); pingtestpass = false; resetEvent.SetOne(); return; } } } catch (Exception err) { SetTextBox("网络出错:" + err.Message + "\r\n"); } } pingtestpass = false; resetEvent.SetOne(); return; }
private void button3_Click(object sender, EventArgs e) { SetTextBox("正在停止更新.....\r\n"); button3.Enabled = false; this.CrossThreadCalls(() => { Temp.Abort(); }); try { countdown = null; DistanceArray = null; } catch (Exception err) { if (err.Message != "正在中止线程。") { MessageBox.Show(err.StackTrace + "\r\n" + err.Message, "close"); } } button2.Enabled = button2.Visible = true; button3.Enabled = button3.Visible = false; button1.Enabled = true; GC.Collect(); }
private void Update_Position(object param) { bool notpass = true; object[] objArr = (object[])param; int i = (int)objArr[0]; MutipleThreadResetEvent countdown = (MutipleThreadResetEvent)objArr[1]; while (notpass) { string getjson1 = DoGetPosition(citys[i]); try { posarr[i].x = Convert.ToDouble(GetLng(getjson1)); posarr[i].y = Convert.ToDouble(GetLat(getjson1)); if (i % 50 == 0) { SetProgressBar(3 + i / 100); } if (!richTextBox1.IsDisposed) { SetTextBox(DataBase_city[i] + " " + posarr[i].x + " " + posarr[i].y + "\r\n"); } notpass = false; } catch (Exception err) { if (!richTextBox1.IsDisposed) { SetTextBox(DataBase_city[i] + " " + err.Message + "\r\n"); } notpass = true; } } countdown.SetOne(); }
private void button1_Click(object sender, EventArgs e) { try { countdown = null; DistanceArray = null; if (Temp != null && Temp.IsAlive) { Temp.Abort(); } if (Th_progress != null && Th_progress.IsAlive) { Th_progress.Abort(); } } catch (Exception err) { if (err.Message != "正在中止线程。") { MessageBox.Show(err.StackTrace + "\r\n" + err.Message, "close"); } } this.Close(); }
private void button2_Click(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; textBox1.ReadOnly = false; button6.Enabled = false; button1.Enabled = false; button2.Enabled = button2.Visible = false; button3.Enabled = button3.Visible = true; DBControllerSet.DistanceDBController distanceclr = new DBControllerSet.DistanceDBController(); richTextBox1.Text = ""; citys = null; eq = 0; DistanceArray = null; countdown = null; DataBase_city = null; passthrough = true; posarr = null; GC.Collect(); Control.CheckForIllegalCrossThreadCalls = false; Temp = new Thread(() => { try { int snum = 0; int sum_db = Convert.ToInt32(Math.Sqrt(distanceclr.Getsum())); Control.CheckForIllegalCrossThreadCalls = false; SetTextBox("正在试图连接地图更新服务器......\r\n"); ThreadPool.SetMinThreads(20, 20); ThreadPool.SetMaxThreads(60, 60); countdown = new MutipleThreadResetEvent(1); object obj = countdown; ThreadPool.QueueUserWorkItem(new WaitCallback(Pingtest), obj); countdown.WaitAll(); if (!pingtestpass) { button2.Enabled = button2.Visible = false; button3.Enabled = button3.Visible = false; button1.Enabled = true; return; } citys = inputline.Split(' '); SetTextBox("准备更新坐标......\r\n"); SetProgressBar(3); DataBase_city = inputline_backup.Split(' '); posarr = new pos[DataBase_city.Length]; if (textBox1.Text == "") { eq = citys.Length; } else { eq = Convert.ToInt32(textBox1.Text); } countdown = new MutipleThreadResetEvent(eq); for (int i = 0; i < eq; i++) { object[] objectArray = new object[2]; objectArray[0] = i; objectArray[1] = countdown; object param = (object)objectArray; ThreadPool.QueueUserWorkItem(new WaitCallback(Update_Position), param); } SetTextBox("开始更新坐标......\r\n"); countdown.WaitAll(); SetTextBox("坐标更新完毕......\r\n"); SetProgressBar(10); SetTextBox("准备更新距离数据......\r\n"); SetTextBox("共有" + eq + "个地区需要更新......\r\n"); SetTextBox("正在提取数据库,请稍候......\r\n"); DistanceArray = new int[eq, eq]; DistanceArray.Initialize(); DataTable table = new DataTable(); distanceclr.GetTableAll(ref table); int toupdate = ((eq * (eq - 1)) / 2) - ((sum_db * (sum_db - 1)) / 2); SetTextBox("数据库提取完毕......\r\n"); SetTextBox("正在整理数据库,请稍候......\r\n"); int st, sp; while (snum < table.Rows.Count) { st = Array.IndexOf(DataBase_city, table.Rows[snum][0]); sp = Array.IndexOf(DataBase_city, table.Rows[snum][1]); DistanceArray[st, sp] = DistanceArray[sp, st] = Convert.ToInt32(table.Rows[snum][2]); snum++; } SetProgressBar(20); SetTextBox("数据库整理完毕......\r\n"); SetTextBox("共需要从网络更新" + toupdate + "条数据......\r\n"); if (toupdate <= 0 || eq <= sum_db) { goto LISPO; } countdown = new MutipleThreadResetEvent(toupdate); for (int i = sum_db; i < eq; i++) { DistanceArray[i, i] = 1; SetProgressBar(20 + ((i * 20) / eq)); for (int j = 0; j < i; j++) { object[] objectArray = new object[3]; objectArray[0] = i; objectArray[1] = j; objectArray[2] = countdown; object param = (object)objectArray; ThreadPool.QueueUserWorkItem(new WaitCallback(Update_Distance), param); } } SetTextBox("开始更新坐标和距离数据......\r\n"); countdown.WaitAll(); for (int i = 0; i < eq; i++) { DistanceArray[i, i] = 1; } SetTextBox("坐标和距离数据更新完成\r\n"); SetProgressBar(40); while (!passthrough) { SetTextBox("开始重新校验距离数据.....\r\n"); List <int> x = new List <int>(); List <int> y = new List <int>(); int ssr = 0; passthrough = true; for (int i = 0; i < eq; i++) { for (int j = 0; j < i; j++) { if (DistanceArray[i, j] == 0 || DistanceArray[j, i] == 0) { x.Add(i); y.Add(j); ssr++; } } } SetTextBox("有" + ssr + "条数据获取失败或出错.....\r\n"); countdown = new MutipleThreadResetEvent(ssr); for (int j = 0; j < ssr; j++) { object[] objectArray = new object[3]; objectArray[0] = x[j]; objectArray[1] = y[j]; objectArray[2] = countdown; object param = (object)objectArray; ThreadPool.QueueUserWorkItem(new WaitCallback(Update_Distance), param); } countdown.WaitAll(); } citys = null; SetTextBox("坐标和距离数据校验成功\r\n"); SetProgressBar(50); SetTextBox("构造本地数据库.....\r\n"); DataTable newtable = table.Clone(); newtable.Clear(); DataRow dataRow = table.NewRow(); for (int i = 0; i < eq; i++) { dataRow[0] = DataBase_city[i]; dataRow[1] = DataBase_city[i]; dataRow[2] = DistanceArray[i, i]; lock (newtable){ newtable.Rows.Add(dataRow.ItemArray); } for (int j = 0; j < i; j++) { dataRow[0] = DataBase_city[i]; dataRow[1] = DataBase_city[j]; dataRow[2] = DistanceArray[i, j]; lock (newtable) { newtable.Rows.Add(dataRow.ItemArray); } dataRow[0] = DataBase_city[j]; dataRow[1] = DataBase_city[i]; dataRow[2] = DistanceArray[j, i]; lock (newtable) { newtable.Rows.Add(dataRow.ItemArray); } } } SetTextBox("构造本地数据库完成\r\n"); SetTextBox("开始更新本地数据库.....\r\n"); distanceclr.Clear(); distanceclr.WriteTable(newtable); SetTextBox("已写入数据库!\r\n"); LISPO: SetProgressBar(100); SetTextBox("数据更新完成\r\n"); button6.Enabled = button6.Visible = true; button3.Enabled = false; try { countdown = null; DistanceArray = null; } catch (Exception err) { if (err.Message != "正在中止线程。") { MessageBox.Show(err.StackTrace + "\r\n" + err.Message, "close"); } } button2.Enabled = button2.Visible = true; button3.Enabled = button3.Visible = false; button1.Enabled = true; GC.Collect(); return; } catch (Exception err) { if (err.Message != "正在中止线程。") { MessageBox.Show(err.StackTrace + "\r\n" + err.Message, "click"); } } }); Temp.IsBackground = true; Temp.Start(); }
private void Update_Distance(object param) { try { if (citys == null) { return; } if (DistanceArray == null) { return; } if (richTextBox1.IsDisposed) { return; } object[] objArr = (object[])param; int i = (int)objArr[0]; int j = (int)objArr[1]; MutipleThreadResetEvent countdown = (MutipleThreadResetEvent)objArr[2]; if (richTextBox1.IsDisposed) { countdown.SetOne(); return; } if (citys == null) { countdown.SetOne(); return; } if (DistanceArray == null) { countdown.SetOne(); return; } string sstr = DoGetDistance(i, j); if (richTextBox1.IsDisposed) { countdown.SetOne(); return; } if (DistanceArray == null) { countdown.SetOne(); return; } else if ((sstr == "返回数据为空!" || sstr == "返回数据出错!") && DistanceArray != null) { passthrough = false; DistanceArray[i, j] = DistanceArray[j, i] = 0; } else if (sstr != "返回数据为空!" && sstr != "返回数据出错!" && DistanceArray != null) { DistanceArray[i, j] = DistanceArray[j, i] = Convert.ToInt32(sstr); } else { passthrough = false; countdown.SetOne(); return; } if (!richTextBox1.IsDisposed) { SetTextBox(i.ToString() + ":" + citys[i] + "<-------->" + j.ToString() + ":" + citys[j] + " " + sstr + "\r\n"); } countdown.SetOne(); return; } catch (Exception err) { MessageBox.Show(err.Message, "界面更新出错", MessageBoxButtons.OK, MessageBoxIcon.Error); } }