Autor Beitrag
m.keller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 14.10.14 14:59 
Hallo,

ich muss in meinem Projekt eine immer wieder kehrende Methode aufrufen.
Zurzeit verwende ich ein Task. In diesem wird eine dauer while-Schleife ausgeführt.

Problem ist das 1. die CPU extrem belastet wird 2. ich zwar ein Zeitlichen Durchlauf im schnitt von 3,5 ms habe aber ich ca. jeden 5 Aufruf Ausreißer von 15 -25 ms habe.

Viel schlimmer ist dabei das diese Methode an sich spätestens alle 9,7 ms aufgerufen haben muss so wie beendet.
Gibt es da eine andere und sichere Möglichkeit wie mit einer while-Schleife, die auch zyklisch mir Sicherheit bietet?

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 14.10.14 15:19 
Was für eine Sicherheit meinst du? Wenn du denn Call alle 9.7 ms brauchst aber der Call länger dauern kann mußt du dich entscheiden ob der abgebrochen und neugestartet werden soll, ein Call dann doch ausfallen darf oder ob mehrere Calls parallel laufen dürfen. Je nachdem bietet sich dann vielleicht etwas anders an. Aber Wunder wird es nicht geben.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 14.10.14 15:40 
hätte ja sein könne das es da etwas gibt.

Mit Sicherheit meine ich, dass ich unter oder maximal 9,7 ms bauche.

Parallel kann ich den Call leider nicht betreiben weil dort ein Netzwerk-befehl gesendet und empfangen wird.
Ich kann ja schlecht versuchen Parallel in das Sendefach zu schreiben, das wird in die Hose gehen.

Dann muss ich mal gucken wo ich Code optimieren kann.
Mich wundert nur das ich teilweise heftige Ausreißer habe

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 14.10.14 21:02 
Wenn du über ein Netzwerk operierst, musst du dann nicht immer damit rechnen, dass sich etwas verzögert?
Ich würde daher eher vorschlagen, zu schauen, warum der Ablauf maximal 9,7 ms dauern darf.
Eventuell lässt sich diese Beschränkung ja aufbrechen. Wenn das eine externe Komponente ist, die die Informationen braucht, wäre es vielleicht sinnvoll, nicht immer in regelmäßigen Abständen Daten abzugreifen, sondern zu Informieren, wenn neue Daten angekommen sind.

Ich weiß nicht, was du vor hast, aber für mich klingt das irgendwie danach, dass der Grund, der die Zeitbeschränkung vor gibt, warten und nicht die Verarbeitung schneller arbeiten sollte.
Klar, je schneller, desto besser, aber je nach System und externen Einflüssen (die in einem Netzwerk nunmal gegeben sind) lässt sich nie sicher die benötigte Zeit voraus sagen. Wenn ein System aber von genauen Zeitabständen abhängig ist, dann muss diese Abhängigkeit aufgelöst werden, dann läuft es auch stabil, wenn z.B. das Switch im Netzwerk den Geist aufgibt und nur noch geringe Übertragungsraten schafft. Bis das neue Switch dann da ist, läuft das System zwar langsam, aber es läuft.

Das beantwortet deine Frage nicht, aber eventuell kannst du ja die Ursache für das Problem beseitigen.
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mi 15.10.14 07:57 
Das wüde rund 103 Hz beim Übertragungstakt bedeuten. Für was bracuhst du eine so schnelle Taktung? Alternativ - wenn es dein System zulässt - könntest du ja deine Rechen- oder sonstige Operationen mit deinen 9,7ms laufen lassen und die Ergebnisse puffern. Und die Datenübertragung halt nur alle 2 oder 3 Opertionen durchführen (51 bis 34 Hz). Je nach dem was du überträgst, bzw. wie viel, solltest du noch die verschiedenen Protokolle berücksichtigen (UDP, TCP, ...)

///Nachtrag

Ich habe es bei zeitkritischer, systemübergreifender Datenübertragung als so gemacht, dass ich mir eine Klasse für die Kommunikation geschrieben habe und dort dann ein Array der zu übertragenden Daten bereitgestellt habe, welches ich dann von außen gefüllt habe. Die Kommunikationsklasse hat dann das Array abgearbeitet, sobald Daten in das Array geschickt wurden. Somit sendest man alle anstehenden Daten so schnell es das Netzwerk zulässt.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler


Zuletzt bearbeitet von C# am Mi 15.10.14 08:02, insgesamt 1-mal bearbeitet
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mi 15.10.14 08:02 
Das man im Netzwerk nie eine konstante Verführbarkeit hat war mir bewusst.

Im Endeffekt hängt an einer Netzwerkkarte direct das System was mir Daten liefert.
Ich vermute mittlerweile dass das System nicht schnell genug Daten bereitstellen kann.
Die Zeitlichen Schwankungen reichen von 0,.. ms bis hin zu 25 ms.
Wobei der größte teil unter 5 ms bleibt.

Kann es eventuell auch an einer Priorisierung von meinem Thread liegen?
In dem Augenblick wenn ich Daten abhole muss nichts anderes funktionieren.

Die übertragenen Strings sind maximal 1024 Zeichen lang. Zu mindestens zur Zeit.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mi 15.10.14 08:08 
Zum Senden und empfangen habe ich auch schon eine eigenen Klasse.
Das mit dem Array ist eine gute Idee.
Sollte ich mal ausprobieren.
Ich könnte dann zwei Arrays bauen,
1. für das Sendefach wo die zu sendenden strings drin stehen
2. für das Empfangsfach wo die empfangenen Daten gespeichert werden.

Dann kann ich beide Array separat bearbeiten und der reihe nach abarbeiten.
und die Klasse zum senden und empfangen kann Komplet autark arbeiten.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Mi 15.10.14 09:43 
Anstelle von Arrays würde ich Queues nehmen, da ist das ganze Geraffel mit "welcher ist mein nächster Eintrag" und "ist meine Warteschlange voll" und so weiter bereits abgefrühstückt.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.