none
Gmap.net marker無法拖拉!!! RRS feed

  • 問題

  • SerialPort接收處理

    void DoReceive()...
    
    void handle(List<Byte> tempList)...
    
    void DisplayText(Byte[] buffer)...
    
    private void btn_Conn_Click(object sender, EventArgs e)
    {
                try
                {
                    comport = new SerialPort(cbCOM.SelectedItem.ToString(), 57600, Parity.None, 8, StopBits.One);
    
                    if (!comport.IsOpen)
                    {
                        comport.Open();
    
                        btn_disConn.Visible = true;
                        btn_Conn.Visible = false;
    
                        receiving = true;
                        t = new Thread(DoReceive);
                        t.IsBackground = true;
                        t.Start();
                    }
                }
                catch (NullReferenceException)
                {
                    MessageBox.Show("請選擇連接埠!!", "連線錯誤", MessageBoxButtons.OK);
                }
            }       
    
    
    
    移動marker動作
    void MainMap_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left && isMouseDown)
                {
                    if (CurentRectMarker == null)
                    {
                        if (currentMarker.IsVisible)
                        {
                            currentMarker.Position = MainMap.FromLocalToLatLng(e.X, e.Y);
                        }
                    }
                    else // 移動 rect marker
                    {
                        PointLatLng pnew = MainMap.FromLocalToLatLng(e.X, e.Y);
    
                        //移動marker後,重新繪製polygon
                        int? pIndex = (int?)CurentRectMarker.Tag;   //問號代表可為null型態
                        if (pIndex.HasValue)
                        {
                            if (pIndex < polygon.Points.Count)
                            {
                                polygon.Points[pIndex.Value] = pnew;
                                MainMap.UpdatePolygonLocalPosition(polygon);
                            }
                        }
    
                        if (currentMarker.IsVisible)
                        {
                            currentMarker.Position = pnew;
                        }
                        CurentRectMarker.Position = pnew;
    
                        if (CurentRectMarker.InnerMarker != null)
                        {
                            CurentRectMarker.InnerMarker.Position = pnew;
                            CurentRectMarker.InnerMarker.ToolTipText = pnew.ToString(); //移動後更新內部座標Tag
                        }
                    }
                }
                
            }
    請教一下各位高手
    首先小弟我用SerialPort一直接收資料
    開啟連線後就會持續做DoReveive

    現在有個問題是
    我在地圖上新增多個marker
    但只要是在連線狀態下,我就一直沒辦法完整執行MouseMove函式(拖拉marker的動作)
    請問有什麼方法能改善?!

    P.S 我觀察到就是MouseMove還沒做完,就會被Thread中斷跑到DoReceive那邊...QAQ


    2015年4月3日 上午 03:18

解答

  • 您可以試試在滑鼠按下進行拖曳操作時先停止接收感測器資料, 待拖曳操作結束再繼續接收資料看看是否有改善
    • 已標示為解答 kira20206 2015年4月8日 上午 01:41
    2015年4月7日 上午 07:39

所有回覆

  • 您可以參考這篇討論的做法:MouseDown on marker

    2015年4月4日 上午 01:28
  • tihs大,謝謝您提供參考,小弟試過以後還是會有相同情形。

    我今天又觀察了一下,好像跟物件顯示有關係。

    我不斷接收感測器資料後並顯示在TextBox上,導致我沒辦法拖拉地圖上的Marker,把TextBox移除後就可以了(此時還是一直接收資料)

    但是總不能只有地圖沒有資訊阿XDDD

    所以請問有什麼方法可以解決這樣的情形嗎?
    2015年4月7日 上午 03:30
  • 您可以試試在滑鼠按下進行拖曳操作時先停止接收感測器資料, 待拖曳操作結束再繼續接收資料看看是否有改善
    • 已標示為解答 kira20206 2015年4月8日 上午 01:41
    2015年4月7日 上午 07:39
  • 感謝tihs大,依照您的方式已經成功了^^

    請問有沒有不暫停感測器也能動作的方法呢?

    感覺好像是接收的Thread和物件顯示的Thread衝突(← 有錯請糾正>"<)

    2015年4月8日 上午 01:44
  • 因為您的程式接受感測器的資料並顯示到TextBox, 我猜因此影響到焦點(Focus)的位置, 造成拖曳失敗(我只是猜測), 如果要不中斷接收資料的動作, 可以先試看看將接收的資料顯示到Label控制項而不是TextBox, 這樣應該不會影響焦點, 如果成功, 就可以証明確實是焦點的影響, 再想辦法解決焦點的問題
    2015年4月8日 上午 04:04
  • 剛剛測試了一下,很遺憾,Label控制項也會有這樣的情形噢! QAQ
    2015年4月8日 上午 05:40
  • 那就不是焦點的問題, 您接收感測器資料的動作是用執行緒處理的嗎? 如果是的話, 處理接收資料的動作中有加上一點延遲嗎? 例如:

    Thread.Sleep(1);

    2015年4月10日 上午 04:10
  • 我沒有加Sleep說。不過剛剛試了下,要讓marker能正常拖移,Sleep要很久,不然還是會有同樣情形噢!

    畢竟感測器一秒5次接收資料XDD

    如果真的不行,只能用Boolean暫停顯示部分,等拖完marker後再繼續顯示吧!!
    2015年4月10日 上午 08:46
  • 嗯, Sleep很久可能是人為拖曳操作時間無法很快完成吧
    2015年4月11日 上午 08:07
  • 嗯! 沒錯! 因為拖曳marker需要以秒為單位,所以用Sleep至少也要1000以上才能正常拖曳!!(也就是要在1秒內完成XD)
    2015年4月13日 上午 01:37
  • 還有一些方式可以嘗試, 不過要試才知道是否會成功:

    1) 調降接收感測器資料的執行緒的優先順序

    2) 改用平行運算來執行資料接收的動作


    • 已編輯 tihsMVP 2015年4月16日 上午 04:24
    2015年4月13日 上午 04:15
  • 不好意思這麼晚回覆,那我先試試調降接收資料的優先權!

    不過第二種方式有點不太能理解耶?! 用平行運算而非來執行這裡聽不太懂說...可以請解釋一下嗎?  謝謝^^


    2015年4月16日 上午 01:39
  • 不好意思, 語句寫的不好. 已訂正
    2015年4月16日 上午 04:25