Skip to content
0451 - 76 96 00 [email protected]

Drive VXO Asfalts-SM 2021

I lördags (19/6-2021) kördes andra asfaltstävlingen utanför Växjö och en dag innan start stod vi inför ett litet teknisk dilemma. Race Consultings API kunde endast leverera tider via det standardiserade JSON-formatet och TV kunde endast läsa textfiler.

Novastream AB började ta fram en applikation för att presentera resultaten omgående. Vi konstaterade att skriva till en CSV fil eller XLSX fil inte var en hållbar lösning då Excel låser filen vid läsning och hindrar oss från att skriva.

Vi valde att använda DataGridViews tillsammans med följande bibliotek:

  • websocket-sharp – kommunikation mellan vår klient och en socket server
  • serilog + serilog WinForm sink – avancerad loggning av händelser i applikationen
  • RestSharp – för kommunikation med RestAPI
  • JSON.NET – för konvertering av JSON sträng till objekt
  • CSVHelper – för att skriva alla resultat till en CSV fil

RClient - Code

Vi stötte på följande problem under den korta utvecklingstiden:

  • När inga nya meddelanden kom in till klienten så avslutades socket anslutningen
  • För varje uppdatering i DataGridView kontrollen så låstes hela applikationen i 20-30ms
  • När applikationen skulle avslutas så avslutades inte de aktiva bakgrundstrådarna

Så här löste vi problemen som uppstod:

Inga nya meddelanden

websocket-sharp har en funktion för att skicka en ping-signal vilket vi använde oss utav fast i en separat tråd.

Applikationen låser sig vid uppdatering av DataGridView

Vi använde oss utav Update och Refresh efter varje rad vilket visade sig vara en mindre effektiv lösning. Vad vi efter lite sökningar på Google kom fram till är att vi var
tvungna att aktivera Double Buffer och köra Suspend / Resume layout (Se svar från StackOverflow).

Att ladda ca 7000 rader tog med Update / Refresh ca 1-2 minuter, samma mängd rader men med Suspend / Resume layout tog ca: 10-15 sekunder.

Applikationen avslutades inte pga. aktiva trådar

Oavsett om vi avslutade vår socket-anslutning och våra while loopar så ville inte applikationen avslutas. Vi kom fram till att vi var tvungna att använda oss utav  Application.ExitThread() innan vi kallade på Application.Exit().

Resultat

I sin helhet lyckades vi ta fram en användbar applikation på ett par timmar och lösa de buggar som uppstod under tävlingens gång.

Applikationen döpte vi till RClient och du hittar den här:
https://novastream.se/produkt/rclient-socket-klient-for-tv-exporter/

Du hittar resultaten till tävlingen här:
http://www.raceconsulting.com/rally/resultat/tavling.jsp?competition=1296

Här hittar du mer information om Rally-SM:
https://www.rallysm.se/

Back To Top