mabue88
Goto Top

C-Sharp - Zyklischer Methodenaufruf in TimerElapsed-Event-Routine bleibt stehen

Hallo,

um die Eingänge (analog & digital) einer USB-Interfacekarte (Velleman K8055) einzulesen habe ich die dafür verfügbare DLL in ein C#-Projekt integriert.

In der Klasse "K8055" habe ich die Verweise auf die externen Funktionen der DLL implementiert. Zusätzlich habe ich diverse Methoden erstellt, die von übergeordnetem Programmcode aufgerufen werden können.

Um die Eingänge nicht "manuell" in übergeordneten Programmcode einlesen zu müssen wollte ich innerhalb der Klasse "K8055" einen Timer erstellen, der mir regelmäßig die Eingänge einliest:

public void InputRefreshTimer_Elapsed(object sender, ElapsedEventArgs e)
{
            this.InputRefreshTimer.Stop();

            Console.WriteLine("Start: " + DateTime.Now.ToString());  

            Console.WriteLine(K8055.ReadAllDigital().ToString());

            Console.WriteLine("Ende: " + DateTime.Now.ToString());         

            this.InputRefreshTimer.Start();
}

Rufe ich die Methode manuell auf ( InputRefreshTimer_Elapsed(null, null) ), funktioniert sie wunderbar. Wenn Sie aber durch das Elapsed-Event vom Timer aufgerufen wird, bleibt sie an der Zeile mit dem "K8055,ReadAllData()" stehen.

Ich vermute dass es irgendetwas damit zu tun hat, dass hierbei Threads eingesetzt werden, aber ich komme einfach nicht weiter.

Hat jemand eine Idee?

Danke
mabue

Content-Key: 253581

Url: https://administrator.de/contentid/253581

Printed on: April 20, 2024 at 05:04 o'clock

Member: emeriks
emeriks Nov 01, 2014 at 16:56:40 (UTC)
Goto Top
Hi,
bleibt sie "stehen" (hängt) oder wird eine Exception ausgelöst?
Deinem Verdacht mit dem Thread kannst Du nachgehen, in dem Du den Code in eine eigene Sub packst und diese Sub explizit in einem neuen Thread startest (ohne den Timer).

E.
Member: mabue88
mabue88 Nov 01, 2014 at 17:58:01 (UTC)
Goto Top
Hallo emeriks,

es bleibt tatsächlich stehen. Eine Exception wird nicht ausgelöst.
Wird die Methode direkt aus der Main aufgerufen (kein Thread), läuft sie problemlos durch. Starte ich sie als Thread aus der Main, bleibt sie auch stehen...
Member: schmitzi
schmitzi Nov 02, 2014 at 00:21:04 (UTC)
Goto Top
Hi,

ReadAllDigital() meint aber schon ReadAllData() ?

Gruss RS
Member: colinardo
Solution colinardo Nov 02, 2014 updated at 18:40:23 (UTC)
Goto Top
Verwendest du wirklich die aktuellste DLL des Herstellers?
Der hier hatte nämlich das selbe Problem mit dem Blocking des Threads mit einer älteren Version der DLL:
K8055 call to ReadAllDigital() blocking indefinitely

Grüße Uwe
Member: mabue88
mabue88 Nov 02, 2014 at 18:40:20 (UTC)
Goto Top
Hallo colinardo,

nachdem ich alle Downloads des Herstellers heruntergeladen und die Änderungsdaten der darin enthalten DLLs verglichen habe, habe ich festgestellt, dass es tatsächlich unterschiedliche Versionen davon gibt. Mit der aktuellsten Version funktioniert das Programm.

Danke für deinen Hinweis!

Gruss
mabue
Member: schmitzi
schmitzi Nov 03, 2014 at 18:33:59 (UTC)
Goto Top
Du brauchst doch nur den Nippel durch Lasche ziehn,
und mit der kleinen Kurbel ganz nach oben drehn,
da erscheint dann so ein Pfeil,
und da drückst Du dann nur drauf,
und schon - ist das Update drauf

:o) :o)