ThinkGeo.com    |     Documentation    |     Premium Support

Cross-thread issue

Hello all,


if I want to use multi-thread to show Map, but it shows exception as follows:


Cross-thread operation not valid: Control 'WinformsMap1' accessed from a thread other than the thread it was created on.


I try to use follows method to solve problem.


gis.thinkgeo.com/Support/Dis...fault.aspx


But, I'd like to know other way to solve this problem.


If you have any idea, please let me know. Thanks.


 



Carol, 
  
 Thanks for your reply. 
  
 This exception will be happening when two or more threads are trying to access the WinformsMap1 control. 
  
 Another way is try to put keep winformsMap1 acccessing code into only thread, for example, in the main thread, that would be safe. 
  
 Any more questions just feel free to let me know. 
  
 Thanks. 
  
 Yale 


Sorry, Yale 
 could you give me a sample?  
  
 In my app, I use code as follows: 
  
      private void SetShowMoreCar(string strData) 
         { 
             if (this.InvokeRequired) 
             { 
                 this.BeginInvoke(new dlgShowMoreCar(SetShowMoreCar), new object[] { strData }); 
                 return; 
             } 
  
             this.ShowMoreCar(strData); 
         } 
  
 But, now, I don’t want to remove code as follows: 
           //if (this.InvokeRequired) 
             //{ 
                // this.BeginInvoke(new dlgShowMoreCar(SetShowMoreCar), new object[] { strData }); 
                // return; 
           //  } 
  
 How can I remove these code and don’t show error exception?(Cross-thread operation not valid) 


Carol, 
  
 Can you show me the code in the function ShowMoreCar, it seems that this code need another thread ? 
  
 Thanks. 
  
 Yale 


Thanks for your reply, Yale


ShowMoreCar code shows as follows:

      private void ShowMoreCar(string strData)

        {

            int intFGPSX, intFGPSY;

            try

            {

                if (strData != null && strData != "")

                {

                    if (strData.IndexOf("NULL") < 0)

                    {

                        string[] strGPSData = strData.Trim().Split(',');


                        int lgLat = Convert.ToInt32(strGPSData[2]);

                        int lgLot = Convert.ToInt32(strGPSData[1]);

                        double[] dbFix = this.ucMap.FixGPSPosition(lgLot / 1000000, lgLat / 1000000);//


                        intFGPSX = Convert.ToInt32(dbFix[0]);

                        intFGPSY = Convert.ToInt32(dbFix[1]);

                        if (intFGPSX == 0)

                        {

                            this.SetCarMap(strGPSData[0], lgLot, lgLat);

                        }

                        else

                        {

                            this.SetCarMap(strGPSData[0], intFGPSX, intFGPSY);

                        }

                    }

                    else

                    {

                        MessageBox.Show("No Data!", "SystemMessage");

                    }

                }

            }

            catch (Exception ex)

            {

                (this.MdiParent as Form1).RecErrMessage(ex.Message, "ShowMoreCar:" + strData, this.lblGPSData.Text);

            }      


 


And, Could you explain about attribute of winformsMap1.ThreadingMode.


What is the difference between Mode of MultiThread or SingleThread?


 



Carol, 
  
 Thanks for your code; it seems some code still missed, for example, FixGPSPosition and SetCarMap methods.  
  
 It would be nice if you could send me a small sample application to show me your problem. 
  
 Thanks. 
  
 Yale 


Hello, Yale

it's difficult to give you complete code.

I try to give some code. I think it may help you to find solution.



MapTest.zip (4.8 KB)

Carol, 
  
 Sorry for the delay. 
  
 Up to now, I tried to remove those Invoke system in Multi-threaded mode, but unfortunately without any good luck. It seems this is the only way we avoid threading problems. 
  
 Any more questions just feel free to let me know. 
  
 Thanks. 
  
 Yale