Hi Everybody,
I`ve a new question regarding a new Add-In I`m writing. It`s still for ArcGIS Pro 1.4 and SDK version 1.3.0.5861 because it extents another system on that state. Basically it monitors a local GPS device via serial port and shows the data in different ways. Everything works as desired at the moment but I`m experiencing the behaviour that my ArcGIS Pro buttons from time to time grey out /disable for a short moment.
I know this may have something to do that my UI-thread is blocked somehow but I can`t imagine the reason.
Because my Add-In has already some code in it I decided to attach the complete project as attachment. It will not run as stand-alone because it expects another add-in to be present but maybe the full code will be helpful.
Additionally I`ll try to explain what I`m doing in simplified pseudo code here:
<SPAN class="keyword token">protected</SPAN> <SPAN class="token function">GpsPanelViewModel</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
_gpsReader <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">GPSReader</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
_gpsReader<SPAN class="punctuation token">.</SPAN>RaiseGpsValuesReceivedEvent <SPAN class="operator token">+</SPAN><SPAN class="operator token">=</SPAN> HandleNewGPSValuesReceivedEvent<SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">private</SPAN> <SPAN class="keyword token">async</SPAN> <SPAN class="keyword token">void</SPAN> <SPAN class="token function">HandleNewGPSValuesReceivedEvent</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">object</SPAN> sender<SPAN class="punctuation token">,</SPAN> GpsValueReceivedEventArgs e<SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">var</SPAN> disposable <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">await</SPAN> QueuedTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Run</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="comment token">// Do something with received GPS-Data</SPAN>
<SPAN class="comment token">// Add map point and update view model parameters for UI update</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">public</SPAN> <SPAN class="keyword token">void</SPAN> <SPAN class="token function">DoSomethingWhenGPSButtonIsClicked</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">object</SPAN> obj<SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="punctuation token">(</SPAN>_gpsIsActive <SPAN class="operator token">==</SPAN> <SPAN class="keyword token">false</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
_gpsReader<SPAN class="punctuation token">.</SPAN><SPAN class="token function">StartReading</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">else</SPAN>
<SPAN class="punctuation token">{</SPAN>
_gpsReader<SPAN class="punctuation token">.</SPAN><SPAN class="token function">StopReading</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">public</SPAN> <SPAN class="keyword token">class</SPAN> <SPAN class="token class-name">GPSReader</SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">private</SPAN> Thread _readGpsThread<SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">private</SPAN> Thread _parseGpsThread<SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">private</SPAN> System<SPAN class="punctuation token">.</SPAN>Threading<SPAN class="punctuation token">.</SPAN>Timer _timerReader<SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">private</SPAN> System<SPAN class="punctuation token">.</SPAN>Threading<SPAN class="punctuation token">.</SPAN>Timer _timerParser<SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">private</SPAN> BlockingCollection<SPAN class="operator token"><</SPAN>GpsRawData<SPAN class="operator token">></SPAN> _gpsDataBuffer<SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">public</SPAN> <SPAN class="keyword token">void</SPAN> <SPAN class="token function">StartReading</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
_readGpsThread <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Thread</SPAN><SPAN class="punctuation token">(</SPAN>StartGpsReaderLoop<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
_parseGpsThread <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">Thread</SPAN><SPAN class="punctuation token">(</SPAN>StartGpsParserLoop<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
_readGpsThread<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Start</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
_parseGpsThread<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Start</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">public</SPAN> <SPAN class="keyword token">void</SPAN> <SPAN class="token function">StopReading</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="token function">ClosePort</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
_timerReader<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Change</SPAN><SPAN class="punctuation token">(</SPAN>Timeout<SPAN class="punctuation token">.</SPAN>Infinite<SPAN class="punctuation token">,</SPAN> Timeout<SPAN class="punctuation token">.</SPAN>Infinite<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
_timerParser<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Change</SPAN><SPAN class="punctuation token">(</SPAN>Timeout<SPAN class="punctuation token">.</SPAN>Infinite<SPAN class="punctuation token">,</SPAN> Timeout<SPAN class="punctuation token">.</SPAN>Infinite<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
_readGpsThread<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Abort</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
_parseGpsThread<SPAN class="punctuation token">.</SPAN><SPAN class="token function">Abort</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">private</SPAN> <SPAN class="keyword token">void</SPAN> <SPAN class="token function">StartGpsReaderLoop</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
_timerReader <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">System<SPAN class="punctuation token">.</SPAN>Threading<SPAN class="punctuation token">.</SPAN>Timer</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>e<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="token function">GetData</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="comment token">// GET data from GPS and store in _gpsDataBuffer</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">null</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">1000</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="keyword token">private</SPAN> <SPAN class="keyword token">void</SPAN> <SPAN class="token function">StartGpsParserLoop</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">{</SPAN>
_timerParser <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">System<SPAN class="punctuation token">.</SPAN>Threading<SPAN class="punctuation token">.</SPAN>Timer</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>e<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN>
<SPAN class="punctuation token">{</SPAN>
<SPAN class="token function">ParseData</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="comment token">// Get raw data from _gpsDataBuffer and raise event when finished</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">null</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">500</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>The main question for me is, where does the probem occur? Is it because I`m running two additional threads in my GPS-Reader?
Any help would be very appreciated.
Best regards
Richard