tdInit(), tdClose() ger Exception

Moderator: Telldus

Post Reply
PerM
Posts: 58
Joined: Thu Jan 18, 2018 11:08 am
Contact:

tdInit(), tdClose() ger Exception

Post by PerM » Thu Jan 18, 2018 11:08 am

Hej Telldus-utvecklare,

Till att börja med så saknar jag en avdelning avsedd för programmeringsdiskussioner kring era produkter, eller vill ni att de ska postas i "Allmänt" ?

Nästa grej:

Hela mitt test ser ut så här:

Code: Select all

[TestMethod]
		public void TestInit()
		{
			for( int i = 0; i < 2; ++i ) {
				using( TWrapper w = new TWrapper() ) {

				}
			}
		}
Hela TWrapper klassen ser ut så här:

Code: Select all

public sealed class TWrapper : IDisposable
	{
		public TWrapper()
		{
			Interop.Init();
		}

		private void Close()
		{
			Interop.Close();
		}

		#region IDisposable

		private bool disposed = false;

		public void Dispose()
		{
			Dispose( true );
			GC.SuppressFinalize( this );
		}
				
		~TWrapper()
		{
			Dispose( false );
		}

		protected void Dispose( bool disposeManaged )
		{
			if( !disposed ) {
				if( disposeManaged ) {

				}

				Close();

				disposed = true;
			}
		}

		#endregion // IDisposable
	}
Slutligen Interop-klassen:

Code: Select all

/// <summary>
		/// Initializes communication with Telldus-core
		/// </summary>
		[DllImport( "Tellduscore.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.StdCall, EntryPoint="tdInit")]
		public static extern void Init();

		/// <summary>
		/// Closes the communication with Telldus-core
		/// </summary>
		[DllImport( "Tellduscore.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.StdCall, EntryPoint="tdClose" )]
		public static extern void Close();
Loopen i TestInit() går bra ett varv, men andra varvet så resulterar anropet till Close() och i förlängningen därmed till tdClose() i tellduscore.dll i följande fel:
System.AccessViolationException was unhandled by user code
Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Source=CZTellstickWrapper
StackTrace:
....
InnerException:
Jag gissar på att detta är vad som diskuterats i denna tråd: http://www.telldus.com/forum/viewtopic.php?f=7&t=2139

Kör man samma test via C++/CLI, som i den länkade tråden, så uppstår inte detta problem, det syns iaf inte utåt. Det kan ju dock bero på att med C++/CLI så används ju inte MSIL vid anropet, vilket också tar bort valideringen, så det är ju möjligt att det bara 'göms'. Mina signaturer för PInvoke skiljer sig visserligen rent visuellt mot de som finns i er .NET wrapper, men valda värden är ju de samma som standardvärdena.

Det bör vara tämligen lätt för er att reproducera, detta.

Jag har v2.1.1 av Tellduscenter installerat på en W7 x64 (men felet uppträder även som 32-bitars process).
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....

PerM
Posts: 58
Joined: Thu Jan 18, 2018 11:08 am
Contact:

Re: tdInit(), tdClose() ger Exception

Post by PerM » Thu Jan 18, 2018 11:08 am

Kom igen nu, det borde ligga i Telldus intresse att svara på detta - ju fler mjukvaror som stödjer er produkt, desto fler Tellstickenheter kan ni sälja.
Se också supportärende 2596, inskickat två dagar sedan.
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....

stefan.persson
Posts: 353
Joined: Thu Jan 18, 2018 11:08 am

Re: tdInit(), tdClose() ger Exception

Post by stefan.persson » Thu Jan 18, 2018 11:08 am

Hej!
Kanske borde vi ha en speciell avdelning för programmeringsfrågor i forumet, men annars går det utmärkt att posta här.

tdInit() och tdClose() ska egentligen bara köras en enda gång vardera, när biblioteket laddas in och när det laddas ur vid avslutning. Har man t.ex. flera wrapper-instanser kommer tdClose() att stänga för dem alla. Dock finns det en bugg i biblioteket som gör att hela programmet kan krascha om tdClose() körs flera gånger, http://developer.telldus.com/ticket/188 Fix finns och kommer i nästa version.
Stefan Persson
Software
Telldus Technologies

PerM
Posts: 58
Joined: Thu Jan 18, 2018 11:08 am
Contact:

Re: tdInit(), tdClose() ger Exception

Post by PerM » Thu Jan 18, 2018 11:08 am

Ja, det förklarar ju varför det smäller.

När kan vi vänta oss nästa version, buggen har ju varit känd i ett halvår?
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....

micke.prag
Site Admin
Posts: 2242
Joined: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Re: tdInit(), tdClose() ger Exception

Post by micke.prag » Thu Jan 18, 2018 11:08 am

Nästa version har inget datum. Fixen är ändå ingen kritisk fix eftersom att köra tdInit() efter tdClose() inte är supportat och inte ska göras.
tdInitI() skall endast köras en gång vid applikationens uppstart och tdClose() när biblioteket inte ska användas mer (d.v.s. vid programmets avslut).
Micke Prag
Software
Telldus Technologies

PerM
Posts: 58
Joined: Thu Jan 18, 2018 11:08 am
Contact:

Re: tdInit(), tdClose() ger Exception

Post by PerM » Thu Jan 18, 2018 11:08 am

micke.prag wrote:Nästa version har inget datum. Fixen är ändå ingen kritisk fix eftersom att köra tdInit() efter tdClose() inte är supportat och inte ska göras.
tdInitI() skall endast köras en gång vid applikationens uppstart och tdClose() när biblioteket inte ska användas mer (d.v.s. vid programmets avslut).
Om det inte är giltigt användningsfall, hur kan det då vara en bekräftad bug?

Ett praktiskt exempel där ominitiering faktiskt behövs är i min applikation. Den är uppbyggd av moduler som kan startas/stoppas utan att stänga av hela applikationen. Varje modul sköter sitt eget område, i detta fall kommunikation mot ert API/TelldusCore.dll; tdInit() anropas vid start och tdClose() vid stop av modulen. Enligt ert resonemang går det inte att använda ert bibliotek i en sådan arkitektur om man använt P/Invoke eftersom biblioteket då inte laddas ur förrän AppDomain avslutas när applikationen stängs. Visst, man kan skapa egna AppDomain, men det ökar komplexiteten av helt onödiga skäl.

Lyckligtvis går det att arbeta sig runt problemet genom dynamisk laddning/urladdning av biblioteket via C++/CLI.
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....

Post Reply