コード例 #1
0
        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;
        }
コード例 #2
0
 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();
 }
コード例 #3
0
        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();
        }
コード例 #4
0
 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();
 }
コード例 #5
0
 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();
 }
コード例 #6
0
 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);
     }
 }