Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von luciluke
Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

@Coder007
hatte ich auch so verstanden und macht mir dadurch leider auch weiter Hoffnung auf einen anderen besseren Weg.
Mehr als mein jetziges Vorgehen zu beschreiben, den Code zu posten und um Stellungnahme zu bitten

Zitat
Aber eigentlich geht es auch nur darum, ob diese beiden Anzeigen im Code so richtig implementiert sind. Wenn mir jemand dazu etwas sagen könnte, wäre mir sehr geholfen.
kann ich aber nicht. Weshalb ich jetzt aufgegeben hatte auf weitere Hilfe zu hoffen.

Meine Aussage:
Zitat
C/C++ mit/ohne Linux mit/ohne Echzeitkernel scheidet von meiner Seite für diese Anwendung leider aus.
ging eher in Richtung T-Virus, der darauf zweimal hinwieß.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Ich hatte halt noch gehofft, dass jemand der das TestProgramm runtergeladen hat auf Anhieb einen krassen Fehler gesehen hat, aber egal.
Also schonmal vielen Dank an alle die hier schon geduldig Zeit investiert haben oder vielleicht doch noch investieren.
Als derzeitiges Fazit scheint ja der Weg mit den zwei Timern und zwei ConcurrentStack (oder ähnlichem mit manuellen Locking) hier der beste zu sein, wenn man mit c#/.net/WPF/WES7 arbeiten muß. Wie auch hier schon frühzeitig vorgeschlagen. C/C++ mit/ohne Linux mit/ohne Echzeitkernel scheidet von meiner Seite für diese Anwendung leider aus.
Bewußt ignoriert habe ich bestimmt nichts und wenn das so rüber gekommen ist entschuldige ich mich natürlich dafür.

Gruß luciluke

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo,
will nicht vielleicht doch jemand noch Kritik am Code oder an der vorgehensweise zur Anzeige machen? Ich habe meinen Weg ja jetzt grob beschrieben und die Testapplikation wurde ja schon verschiedentlich herruntergeladen. Es geht nicht um "(=>100% identische Frameraten)" wie behauptet wird, sondern um möglichst performanten Code vom Zeitpunkt des Datenerhalts bis zur Anzeige.
Wenn meine Vorgehensweise so schon in Ordnung ist, wäre das zum einem gut zu erfahren, aber Verbesserungsvorschläge würde ich auch gerne ausprobieren.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo Coder007,
das ist ein Problem der Simulation, da das Zeit-Daten Packet ( hier SmpteFrame ) in dem TestTimer Tick Event erzeugt/ hochgezählt wird und dieser dann ja als erstes zusammenbricht (kürzester Intervall), d.h. die "Zeit" der SmpteFrame wird nicht mehr alle ungefähr 30-40ms erhöht. Im realen Fall kommt das Zeit-Daten Objekt über Netztwerk rein und hat dann natürlich auch die "aktuelle Zeit" bzw. die Zeit die angezeigt werden soll.
Also so krasse Sachen passieren nicht, das ist eine Einstellungssache der Simulation. Wenn ich bei mir WorkOn mit SomeWork count = 20000 habe und die Pegelanzeige ein bzw. aus schalte, dann sehe ich eine etwas schleppendere Anzeige und auf dem J1900 kommt es teilweise zum Stocken.
Auch die Zeiten für die anderen Timer sind ja kürzer als nötig, um überhaupt jetzt mal zum Verständniss einen Unterschied beim umschalten zu sehen. Die zusätzliche Arbeit, die entsteht wenn die Pegel angezeigt werden sind der Punkt. Ob diese zusätzliche Arbeit, durch das Binding im Hintergrund oder weiß nicht genau was da noch passiert, oder aber durch Zusammenspiel DirectX, GPU ... weiß ich nicht.
Die Frage ist, ob das was ich von Packetempfang bis zu den Anzeigen mache so richtig bzw. am besten sogar "optimal" für die Performance ist.
Kannst Du diesen Weg den nachvollziehen, oder soll ich nochmal besser beschreiben?

ps.: rechts unterhalb von der TimeCode Anzeige wird übrigends die verstrichene Zeit je Zeitanzeige Event angezeigt. Also, wenn der Zeitanzeige Timer auf 60 steht, dann sieht man da z.B. dann im guten Fall sowas zwischen 50 und 80. Dient nur dem Verständniss.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Ich versuchs mal...
In TcpServer der _testTimer stellt die Simulation der eingehenden Packete dar, d.h. die Methode Receive ist noch fake.
_model.TcpServer_DataReceived(buffer); ist dann die erste richtige Methode, danach wird dieser buffer wieder als Antwort zurückgeschickt(fehlt jetzt hier).
In TcpServer_DataReceived(byte[] buffer) werden die Daten verarbeitet.
ProzessKbData(kbData_2);//=====> simmuliert hier zusammen mit dem kleinen Tasten Fenster die Keyboardbefehle die eigentlich in den empfangenen Daten enthalten sind.
In _at.ProzessData(atData) findet die eigentliche Arbeit statt.
_model.TimeCodeBufferString.Push(_model.RefreshTimeCodeString(RefInOutFrameCopyTcOnly)); stellt den Timecode String in den ConcurrentStack<string[]> TimeCodeBufferString.
In ProzessSmpteFrameAsync(incommingSMPTE); werden die Daten bearbeitet und nach der Bearbeitung wird in Push_FaderData() eine List<BargraphData> erstellt, die im Prinzip einfach nur die 129 Bargraph Werte enthält. BargraphData implementiert INotifyPropertyChanged.
Diese Liste wird in einen zweiten ConcurrentStack<List<BargraphData>> BargraphBuffer gestellt.
Das war es mit der Bearbeitung und die bearbeiteten Daten werden zurückgeschickt.
Jetzt gibt es noch einen Timer _ltcGuiTimer der alle x ms den letzten wert aus dem ConcurrentStack<string[]> TimeCodeBufferString holt, die weiteren Werte, falls vorhanden, verwirft und dann in RefreshTimeCodeWPF(string[]) in einem Objekt StatusBoxData : DependencyObject ein DependencyProperty ändert. An dieses DependencyProperty ist in MainWindow.xaml entsprechend ein Textblock gebunden.
Und es gibt einen Timer _faderGuiTimer der alle x ms den letzten Wert aus dem ConcurrentStack<List<BargraphData>> BargraphBuffer holt, die weiteren Werte falls vorhanden verwirft und dann in RefreshBargraphGui(List<BargraphData> faderData) eine zweite List<BargraphData> DicCurBargraphData aktuallisiert. An die BargraphData Objekte in dieser Liste sind "BargraphUserControls " in BargraphViewModel.cs gebunden. Und diese Liste von BargraphUserControls dienen als ItemsSource für eine angepasste ListBox zur Anzeige der Pegel. Leider benutze ich mal die Bezeichnung Bargraph mal Fader.
Wenn nötig beschreibe ich das auch gerne nochmal genauer.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Die zwei Fenster sind Absicht, das sind dann zwei Monitore im Vollbildmodus und auf einem kann dann noch manchmal was anderes angezeigt werden, aber das fehlt jetzt hier. Wie im Eingangsbeitrag beschrieben läuft auch sonst nichts anderes auf dem Rechner, es gibt auch keine Maus und kein Keyboard. Relevant ist das, da es vom rendern her doppelte Belastung bedeutet.
Das ist eine Time Code Anzeige und die läuft bei SMPTE30 mit 30 (Film Bildern) Frames pro Sekunde, daher die 30.
Also ich habe einen Intel Core i5-3570 (wohl eher mittel schnell und auch nicht die neuste Grafikkarte) und wenn ich bei WorkOn die Pegelanzeige ein bzw. aus schalte, dann sehe ich eine schleppendere Anzeige. Bei einem Atom mit integrierter Grafik stolpert dann alles.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

@Coder007
danke, dass Du dir das mal anschaust.
Oben rechts läuft ja die Zeitanzeige, um die geht es. Wenn man in der Methode "SomeWork()" den count entsprechend einstellst, dass eine gefühlte Verlangsamung, bzw. ein anderes Muster an der letzten Stelle dieser Zeitanzeige zu erkennen ist, wenn man zwischen Pegel on/off umschaltet, dann hat man das was ich meine. Die Zeiten für die Zeit und die Pegel Anzeige können auch größer gewählt werden, aber ich denke bei der Zeitanzeige sollte es nicht mehr als 90 und bei der Pegelanzeige nicht mehr als 120 sein ( ich schreibe besser mal nicht ms ). Habe es hier jetzt nur mal relativ kurz eingestellt, um überhaupt einen Unterschied erkennen zu können, da ich nicht glaube, dass hier jemand vor ein Rechner mit Celereon oder Atom Prozessor sitzt.
Gut zu sehen ist auch, dass links oben bei der FPS Anzeige (nur für Testzwecke) der Count ziemlich unbeirrt durchläuft. Das die Zahl an den letzten zwei Stellen keinen informativen Wert haben ist klar, aber trotzdem erkennt man wohl am Muster eine vermeintliche Gleichmäßigkeit. Und um diese geht es.
Aber eigentlich geht es auch nur darum, ob diese beiden Anzeigen im Code so richtig implementiert sind. Wenn mir jemand dazu etwas sagen könnte, wäre mir sehr geholfen. Ist z.B. das erste mal, dass ich etwas mit WPF und MVVW gemacht habe.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo,
da unter anderem Palin, erfreulicher Weise, noch nicht ganz aufgegeben hat, habe ich jetzt das Projekt mal auf das nötigste zusammen geschrumpft und die eingehenden Daten über einen Timer simmuliert. Die Refreshzeiten für den "Zeit anzeigen Timer (60ms)" und den "Bargraph anzeigen Timer (90ms)" können einfach ein/umgestellt werden. So wie das Program jetzt eingestellt ist läuft es auf meinem Entwicklungsrechner gleichmäßig, egal ob die Pegel unter Last angezeigt werden oder nicht, auf dem Rechner mit dem J1900 Processor jedoch nicht, oder nicht ausreichend. Es wird also ganz gut das Orginal simmuliert.
Ist jetzt nicht sonderlich kommentiert und sortiert, da ich annehme, daß man sowieso kein ganzes Projekt anhängen kann/soll, aber wie soll ich sonst die Zusammenhänge erklären. Sehr viele Codeausschnitte sind wohl auch nicht übersichtlicher, oder? (<- ernstgemeinte Frage, dann mache ich das)

ps.:
Um das doch nochmal kurz klar zustellen. Ich weiß genau, daß sowohl Windows 7 als auch WES7 keine Echtzeit Systeme sind, und ich verstehe nicht wieso mir hier teilweise das Gegenteil unterstellt wird.
Aber wenn das Program auf dem einem Windows 7 Rechner gleichmäßig genug läuft und auf dem anderen nicht, dann darf ich ja wohl behaupten, daß es nicht "nur" !!! an Windows liegt.
Das es auch an Windows und .net mit GC usw. liegt ist schon klar. Trotzdem würde ich halt gerne das beste rausholen. Es kann ja gut sein, daß ich irgendwo einen krassen Fehler mache.

Zitat aus Anfangsbeitrag:

Zitat
Mit beschäftigt und ausprobiert habe ich unter anderem Windows Forms, WPF, WPF mit Windows Forms Host, RenderTargetBitmap, SharpDX/SlimDX mit/ohne WPF Host, usw. .

WPF Drawing Performance
bestätigt auch meine Tests, auf sehr unterschiedlicher Hardware (s.a.: RenderCapability.Tier, RenderOptions.ProcessRenderMode usw.) Weswegen ich auch unter anderem Windows Forms verworfen habe, da XP (XPe) keine Option mehr ist.

Gameloop scheidet wohl aus, da die Datenverarbeitung (Antwort erstellen/zurückschicken) höchste Priorität hatt. Hatte ich mich im Rahmen von DirectX usw. auch mit beschäftigt.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo Abt,
ist mir jetzt nicht so ganz klar, warum Du verärgert bist, bzw. Du mir jetzt hier unterstellst Sachverhalte nicht zu verstehen, zu denen ich mich gar nicht geäußert habe.

Zitat
Das Auge kann informativ nicht mehr als 3-4 verschiedene Werte pro Sekunde _kurzfristig_ verwerten. Erkennen kann es mehr, aber nicht sachlich verarbeiten.

Wo bitte habe ich irgendwo etwas gegenteiliges behauptet. Ich rede immer von erkennbar fehlender Gleichmäßigkeit.

Wenn Du mit zwei Timern zwei Label aktuallisieren läßt und ein Timer läuft mit 60ms und einer mit 90ms, beide greifen auf die gleiche Zahl zu, die mit einem Timer alle 30ms von 1 bis 30 hochgezählt wird, dann siehst Du da einen Unterschied. Und wenn Du nun eine Anzeige hast und diese zwischen diesen beiden Geschwindigkeiten springt bzw. schwankt, dann sieht das extrem schlecht aus und ist bei dieser speziellen Anwendung nicht akzeptabel. Und wenn es mit einem leistungsfähigerem Prozessor geht, dann liegt es halt eben nicht nur an Windows oder .Net, sondern kann auch am Code liegen. Und ob ein Gerät, lüfterlos gebaut werden kann oder nicht ist auch schon ein signifikanter Unterschied. Und wenn sich heraustellen sollte, dass es nicht geht bzw. ich es nicht hinkriege, dann muß halt ein leistungsfähigerer Prozessor her.

Aber Du hast selber geschrieben:
Zitat
Die höchste Gleichmäßigkeit, die er erreichen kann (denke ich), ist alle ~50-100ms die Anzeige aus einem Datenpool durch einen Timer zu aktualisieren.

Ja, das wäre doch perfekt, da würde ich halt gerne landen und deshalb habe ich hier um Hilfe gebeten.
Ich habe nur in der Problemstellung die 33ms erwähnt, sonst rede ich immer nur von Gleichmäßigkeit.
Zitat
luciluke hat leider bis jetzt überhaupt nicht verstanden, oder ignoriert es, dass exakt alle 33ms etwas zu verarbeiten und dann auch noch zu zeichnen in dieser Umgebung nicht möglich ist.

wo bitte habe ich zu dieser Schlußfolgerung Anlass gegeben.

Meine Aussage.
Zitat
Ja, es soll einfach nur gleichmäßig laufen und ich mache das auch im Moment schon mit zwei Timern alle 90ms die Zeitanzeige und alle 150ms die Pegelanzeige.
Aber auch das schwankt.

Was ich nicht verstehe ist das Fazit, aber nun genug zu meiner Ehrenrettung.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo Abt, Hallo Palin
ich kann das jetzt nicht so stehen lassen, das ich das nicht verstanden hätte.

In meinem letzten Post habe ich lediglich die Frage von pinki beantwortet und die Pakete kommen nunmal alle 33ms +-3ms rein. Und ich habe die Problemstellung von "nicht häufig genug" auf "nicht gleichmäßig genug " richtiggestellt, da Palin danach fragte.
In meinem vorletztem Post habe ich doch auch geschrieben:

Zitat
Ich versuche jetzt nochmal die Variante mit zwei Timern und zwei ConcurrentStack für jeweils Zeit- und Pegel-Anzeige, da ich ja eigentlich auch davon überzeugt bin, daß dies die beste Lösung ist.
und da bin ich dabei, ist halt etwas umfangreicher.
Und wenn ich da ein einigermaßen befriedigendes Ergebniss hinbekomme, versuche ich mal in Auszügen den gesamten Weg zu posten, um schauen zu können, wo es noch besser geht. Allein für die Anzeige der Zeit in WPF gibt es ja schon einige unterschiedlich Wege.

Der tote Gaul ist also fleissig und bestimmt nicht beratungsresistent.
Im Gegenteil ich freue mich ja, das Ihr mir helft. Und das habt Ihr jetzt schon!

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

@Palin Das Problem ist, daß es nicht gleichmäßig genug aktuallisiert, nicht nicht oft genug aktualisiert.

@pinki alle 33 ms +- 3ms ein Paket

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo Abt Hallo Coder007,
ich hatte es jetzt ja nur nochmal ohne Entkopplung getestet, da Palin meinte es mal ohne Timer zu versuchen und das dies nicht zu Erfolg geführt hat habe ich geschrieben.

@Coder007:

Zitat
...solche Spielereien wie die Musik durch irgendwelche grafischen Effekte zu visualisieren
Wenn Du die grafischen Effekte mal mit einer Frameanzeige, also einer hochlaufenden Zahl ersetzt, würdest Du warscheinlich auch Unregelmäßigkeiten sehen. Bei z.B. einer Balkenanzeige meine ich auch alles flüßig zu sehen, aber anscheindend kann man Zahlen genauer wahrnehmen, da man daran gewöhnt ist zu zählen oder so, nur eine Vermutung. Und wenn ich mir z.B. die Visuallisierung vom VLC Player ansehe (VU Meter), dann sieht man, daß diese unter anderem erst ca. 500 ms später anläuft und auch genauso lange nachläuft, wenn gestoppt wird, da wird anscheinend gar nicht auf das Timing geachtet hauptsache es bewegt sich was. Das reicht bei meiner Anwendung leider nicht so ganz.

Ich versuche jetzt nochmal die Variante mit zwei Timern und zwei ConcurrentStack für jeweils Zeit- und Pegel-Anzeige, da ich ja eigentlich auch davon überzeugt bin, daß dies die beste Lösung ist.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo, erstmal danke für die Antworten,
habe das ganze jetzt auch nochmal ganz schlicht ohne async, ohne Queue usw. gemacht.
Daten kommen über Netzwerk rein, Zeit wird angezeigt, Daten werden bearbeitet, Daten werden zurückgeschickt.
Wobei bei der Zeitanzeige durch Dispatcher.BeginInvoke(new Action(NewMethod), DispatcherPriority.Send); oder ähnlichem ja schon doch noch etwas asyncron ausgeführt wird um in den UI Thread zu kommen.
Aber auch hier sieht man halt ungleichmäßigkeiten in der Zeitanzeige abhängig von der Systemauslastung.

@Palin (Quellcode wäre hilfreich)
Ich wüßte nicht wo ich da anfangen sollte.
... Wie schon oben geschrieben: Wenn ich die Gui abschalte benötigt ein Durchlauf der Daten (1) ca 1- max. 5ms incl. Empfangen/ Senden ...
Ich hätte also noch gut 20ms Zeit für die Anzeige und das reicht halt nicht immer.

Ich werde wohl einen etwas leistungsstärkeren Prozessor testen müßen und mich dann leider von der lüfterlosen Variante verabschieden, das war ja eigentlich mein Ziel.

Aber die Hoffnung stirbt zu letzt, Ideen werden noch gerne getestet.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

@Abt:

Zitat
Ich werd auch nicht schlau draus, warum es in diesem Fall die Anforderung von Dauerhaft X FPS gibt, wenn sie höher ist als ~27 FPS.
Kann sowieso kein Mensch unterscheiden geschweige denn was mit den Mehrinformationen anfangen.
Ist mir vollstens bewust, deshalb schrieb ich ja auch "... bzw. wo es wenigstens so aus sieht".

@T-Virus:
die Datenakquisition mache ich ja wie geschrieben schon in c/c++ mit einem CE6 Modul

Ich hoffe aber immernoch, da auf einem leistungsstärkeren Rechner mit Grafikkarte die Gleichmäßigkeit gegeben ist. Trotz .net, wpf, ca.15ms timer Auflösung und und und ...

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

... wenn ich das wüßte, wäre es ja auch zu einfach.

Ja, es soll einfach nur gleichmäßig laufen und ich mache das auch im Moment schon mit zwei Timern alle 90ms die Zeitanzeige und alle 150ms die Pegelanzeige.
Aber auch das schwankt. Die FPS wird mit 40-50 angezeigt.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo Abt,
im Prinzip brauche ich wohl eine Technik mit der ich Bereiche des Bildschirms mit unterschiedlicher Priorität zeichenen kann. Zum einen gibt es diese Zeitanzeige, die halt an der letzten Stelle alle 33ms (30fps) aktuallisiert und einen zweitrangigen Bereich in dem ca. 60 Balkenanzeigen (Pegelanzeigen) gezeigt werden.
Und diese Zeitanzeige soll halt immer gleichmässig laufen, es würden natürlich auch z.B. alle 60ms gehen, aber halt gleichmäßig. Das fängt dann immer an ein wenig zäh zu laufen, kann ich nicht anders beschreiben. Kein Echtzeitsystem ist klar, aber z.B. Cubase oder Digijay bekommen ja auch eine Zeitanzeige hin, wo die hintere Zahl gleichmäßig durchläuft bzw. wo es wenigstens so aus sieht.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo,
ist zwar schon was länger her, aber da ich das Problem nur aufgeschoben habe, muß ich doch nochmal einen Versuch starten und um Hilfe/Ideen bitten.
Kurzfassung/Eingrenzung:
Also es geht eigendlich nur darum einen Text mit 9 Zeichen möglichst exact alle ca. 33ms anzuzeigen mit einem Celeron J1900 Processor mit integrieter HD Graphics (Bay Trail) unabhängig von der sonstigen Auslastung des Programes.
Die Datenbearbeitung stellt zeitlich wirklich nicht (mehr) das Problem dar und ist getrennt von der Darstellung.
Aber wann in WPF mit Databinding gezeichnet wird ist vielleicht noch nicht so optimal.

Biete unendliche Dankbarkeit für den entscheidenden Hinweis.

Gruß luciluke

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo FZelle,
mit "syncron erfolgen" meinte ich auch nur die Daten empfangen, bearbeiten und wieder senden. Nicht die Darstellung. Vielleicht einwenig unglücklich formuliert in meinem Anfangs post.
In meinem "TcpServer" läuft ein Thread der den anfragenden Client verbindet und dann wenn ein Paket empfangen wurde wird dieses bearbeitet und wieder zurückgeschickt.
Das wäre ja dann mein Daten Thread, oder?

Für die Anzeigen mache ich immer nach Erhalt eines Paketes eine Kopie der Daten, der Daten Thread läuft weiter.
Diese Kopie habe ich schon einmal einer BlockingCollection<T> hinzugefügt und für die Anzeige in einem extra Task der vom Hauptthread erstellt wurde consumiert, um dann bei z.B. WPF mit hilfe von MVVM usw. z.B. die Zeit anzuzeigen.
Das wäre ja vergleichbar mit SyncQueue ... .
Wobei sich für mich da die Frage stellt was da der Darstellungs Thread ist. Der Task der consumiert und das Property ändert oder das ganze interne WPF Binding danach.

Ich habe auch schon mit einem Timer gearbeitet der die Kopie alle 80ms oder so dargestellt hat. Aber eine 100% flüßige Anzeige des Timecodes unabhängig von der restlichen Programauslastung bekomme ich da einfach nicht hin.

Zitat
Nach erhalt des Datenpackets erstellst du die Antwort und sendest diese.
Wenn du das in 1-5ms hinbekommst ist da schon mal alles OK.


Das bekomme ich incl. der Datenkopie hin.



Hallo gfoidl,
danke für den Hinweis. Hatte ich mich auch schon mit beschäftigt, aber das war soweit ich mich erinnere wohl eher etwas um die Bearbeitung meiner Daten noch zu beschleunigen, aber da die Zeit für die Bearbeitung nicht das Problem war und ist hatte ich das auch nicht weiter verfolgt. Wenn ich das mit der Anzeige in den Griff bekomme, ist das natürlich zu überlegen.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

(vorab: leider mußte ich Echtzeit schreiben, da wirklich alle 33ms eine Antwort erfolgen muß. Möchte aber keine Diskussion über Echtzeit anregen)

Hallo,

folgendes Problem.

Rahmenbedingungen:
- Einplatinen Computer lüfterlos mit WES7 (Windows Embedded Standard 7)
- die Anwendung ist die einzige Anwendung auf dem Rechner

Die Rahmenbedingungen sind halt leider mit ausschlaggebend, da die Anwendung auf z.B. einem Intel Core i5-3570 mit entsprechender Grafikkarte ohne Probleme läuft. Zum Testen habe ich mir einen Rechner mit einem Celeron J1900 Processor geholt, da dieser im Moment wohl der leistungsstärkste lüfterlos zu betreibende ist mit der neusten HD Graphics. Dieser kommt schon an seine Grenzen und die Anzeige hinkt ab und an und dies ist leider nicht akzeptabel.

Anwendungs Beschreibung:
Die Anwendung bekommt über Tcp/Ip von einem Windows CE6 Rechner (auch eigen programierung) alle ca. 33ms (30/sec) einen Timecode Wert, je 130 Messwerte (0-1024) und Schalterstellungen (0-1) übertragen. Diese Werte müßen einzeln (130 Kanäle) in Abhängigkeit unter anderem von der zugehörigen Schalterstellung und des Timecodes bearbeitet, zwischengespeichert und wieder zurückgegeben werden. Am Ende eines Messdurchganges, max. 60 Minuten, müßen alle Werte in einer Datei gespeichert werden.
Der Windows CE6 Rechner steuert eigen entwickelte analoge Ein- Ausgabe Karten und nimmt noch einzelne Char Werte einer Tastatur (keine Pc Tastatur) entgegen und leitet diese auch über Tcp/Ip an den WES7 Rechner weiter, der diese zu Befehlen zusammen setzt. Die Eingabe über diese Tastatur ist die einzige Steuerungs möglichkeit der Anwendung. An dem ganzen System befindet sich also keine Maus und keine Pc Tastatur.
An den WES7 Rechner sind zwei Bildschirme angeschlossen zur Anzeige der Tastatureingaben für die
Bedienung, der Zeit (frame genau) sowie der Messwerte in Form eines Balkens je Kanal (Bargraph-Anzeige).

Problem(e):
Im moment läuft die Datenübertragung über eine syncrone Socket Verbindung (WES7 TcpServer, CE6 TcpClient). Das Datenpaket wird angenommen, bearbeitet und mit den neuen Daten als Antwort zurückgesendet. Während der Bearbeitung (1) wird
(2) der übermittelte Timecode angezeigt
(3) die Bargraph-Anzeige aktualisiert
(4) die Tastatureingaben ausgewertet und angezeigt.

Da es zu jedem empfangenden Daten Paket nur exakt ein Antwort Paket gibt (können ja auch aufgezeichnete Daten sein die zurück geschickt werden), kann der gesamte Ablauf der Anwendung doch nur syncron erfolgen, oder ist da schon der erste Denkfehler?
(2)(3)u.(4) müßen natürlich nicht jeden Durchlauf angezeigt werden.

Mein Problem ist die Gui Aktualisierung (2)(3)u.(4). Die Zeitanzeige (2) sollte z.B. unter allen Umständen, unabhänig von der Auslastung der Anwendung holperfrei durchlaufen, wie z.B. bei Cubase oder anderen Programen mit Timecode Anzeige. Mit beschäftigt und ausprobiert habe ich unteranderem Windows Forms, WPF, WPF mit Windows Forms Host, RenderTargetBitmap, SharpDX/SlimDX mit/ohne WPF Host, usw. .
Wenn ich die Gui abschalte benötigt ein Durchlauf der Daten (1) ca 1- max. 5ms incl. Empfangen/ Senden und die ganze Bearbeitung ist noch lange nicht optimiert.

Da ich mich mit der Anwendung nun schon sehr lange beschäfige, befürchte ich ein wenig blind für das eigentliche Problem zu sein und hoffe hier die erlösende Hilfe zu bekommen.
Ich habe versucht den Zusammenhang so umfangreich wie erstmal nötig darzustellen, aber beantworte gerne spezielle Rückfragen. Alles aufzulisten was ich schon versucht habe erschien mir nicht hilfreich.

Bin für jede Hilfe sehr dankbar.

Thema: Best Practice um Dokumente oder Reports zu erstellen
Am im Forum: Rund um die Programmierung

Hallo,
zwar schon was älter aber das Program (Adressverwaltung, Rechnungen, Lieferschein, Storno usw. drucken) in dem ich das eingesetzt habe wird seit 10 Jahren benutzt ohne Probleme.

EasiReports

Thema: Threadkonzept - Performanceproblem
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo all-finder oder auch jeder der mir helfen kann,

ist zwar schon etwas her, aber ich habe aktuell das gleiche problem.
Auf dem Windows CE Gerät landen Daten mittels C++DLL (auch von mir) und IntPtr in meiner C# Anwendung, die eigentlich nur dazu gedacht ist die Daten über TCP IP an einen "normalen Windows Rechner" zu schicken (TCP IP in C++ würde ich mir gerne ersparen). Dort werden die Daten angezeigt, bearbeitet und wieder zurückgeschickt.
Das Windows CE Gerät arbeitet dann mit den bearbeiteten Daten weiter.
Dies geschieht in etwa alle 33ms. Kommt ein GC lauf dazwischen, sei es auf dem "normalen Windows Rechner" oder auf dem Windows CE Gerät gehen Daten verloren und das ist nicht akzeptable. Vielleicht hat ja jemand eine Idee, wo und wie ich diese gradlienige Verarbeitung aufbrechen kann, um ab und an etwas Zeit für den GC zu schaffen, ohne das Daten verloren gehen.

Gruß Luciluke

Thema: Befehlszeile (einzelne Chars) mit spezieller Syntax auswerten
Am im Forum: Rund um die Programmierung

geht das so in die richtige Richtung?
Ich muß für jede mögliche Kombination einen Enumwert KB_State haben, eine Methode schreiben und einer Action<T> zuweisen, diese zusammen in ein Dictionary packen und das Dictionary für den Übergang erstellen.


enum Input { Char, Subject, Nothing }// enum KB_States ...
Input _currentInput;
KB_States _currentState = KB_States.KB_Empty;
Action<short> CheckCharAction;
Action<short> CheckSubjektAction;
Dictionary<KB_States, Action<short>> _dicStateAction;
Dictionary<KeyValuePair<KB_States, Input>, KB_States> _dicUebergang;
void DataArrived(short kbData)
{
    //würde dann natürlich woanders stehen...
    _dicStateAction = new Dictionary<KB_States, Action<short>>();
    _dicUebergang = new Dictionary<KeyValuePair<KB_States, Input>,KB_States>();
    CheckCharAction = CheckChars;
    CheckSubjektAction = CheckSubjekt;
    _dicUebergang.Add(new KeyValuePair<KB_States, Input>(KB_States.KB_Empty, Input.Subject), KB_States.KB_Sub1);
    _dicUebergang.Add(new KeyValuePair<KB_States, Input>(KB_States.KB_Empty, Input.Char), KB_States.KB_DirektBySpace);
    _dicStateAction.Add(KB_States.KB_DirektBySpace, CheckCharAction);
    _dicStateAction.Add(KB_States.KB_Sub1, CheckSubjektAction);
    //-------

    _currentInput = GetCurrentInput(kbData);
    _currentState = _dicUebergang[new KeyValuePair<KB_States, Input>(_currentState, _currentInput)];
    _dicStateAction[_currentState](kbData);//methode
}

private Input GetCurrentInput(short kbData)
{
    if (IsKBDataChar(kbData))//irgendein Vergleich
    {
        return Input.Char;
    }
    if (IsKBDataSubject(kbData))//irgendein Vergleich
    {
        return Input.Subject;
    }
    return Input.Nothing;

}

private void CheckChars(short kbData)
{
    if (kbData == 0x00)//wenn im Zusammenhang Gültig
    {
        //irgendwas machen
    }
}
private void CheckSubjekt(short kbData)
{
    if (kbData == 0x01)//wenn im Zusammenhang Gültig
    {
        //irgendwas machen
    }
}

Gruß luciluke

Thema: Befehlszeile (einzelne Chars) mit spezieller Syntax auswerten
Am im Forum: Rund um die Programmierung

und ein weiteres Hallo,

nach längerer Beschäftigung, mit dem gesamt Konzept des Projekts, bin ich nun wieder bei der Befehlszeilenauswertung gelandet, wobei sich dieser Teil der Anwendung nun auf einem XP Rechner abspielt, sodaß ich nicht mehr auf CF beschrängt bin.
Ich habe das State Pattern mal anhand von State Pattern in C# in etwas abgeänderter Form implementiert, aber da ich den Grund Aufbau der Implementation (Reflection usw.) nicht komplett verstehe würde ich lieber etwas anderes machen (obwohl es halt funktioniert und das mit den Enums wirklich praktisch ist).

Zitat
Für die Zustände reicht meistens ein Enum, für die Zustandsübergangsfunktion ein Dictionary<Key, NextState>, wobei Key ein zusammengesetzter Wert aus CurrentState und CurrentInput ist.
Ich wüße nicht wo ich da den State abhänigen Code unterbringen müßte. Im Moment habe ich ja in jeder State Klasse eine Methode die prüft ob der Input im Zusammenhang gültig ist.
Wenn ich dazu ein wenig schematischen Code als Hilfestellung bekommen könnte, wäre ich sehr dankbar. Es sei denn die genannte Implementierung von CodeProjekt ist eine gute Wahl, dann würde ich halt schauen dass ich Sie komplett verstehe...

Gruß luciluke

Thema: Befehlszeile (einzelne Chars) mit spezieller Syntax auswerten
Am im Forum: Rund um die Programmierung

nochmal Hallo,

und erstmal vielen Dank für die schnellen und hilfreichen Reaktionen, aufgrund derer ich mir jetzt nocheinmal 2 Stunden die Parser Generatoren angeschaut habe (hatte mich die letzten Tage schon einmal damit beschäftigt), jedoch wenn ich das richtig verstehe benötigen diese immer eine Einbindung Ihrer speziellen laufzeit.dll und selbst wenn diese in c# geschrieben sind müßen sie nicht unbedingt CF 3.5 kompatiebel sein.
Wobei z.B Coco/R wohl nur 2 Code.cs Dateien erstellt, die dann aber ja auch nicht unbedingt CF 3.5 kompatiebel sein müßen.
Ist meine Einschätzung zu den Parser Generatoren richtig oder habe ich die vollkommen falsch verstanden?
Wenn ich die Benutzung von Parser Generatoren letztendlich ausschließen könnte, wäre mein weiteres Vorgehen ja eindeutig ein vereinfachtes State Pattern oder Regex bzw. eine Mischung aus beiden.

Zitat von FZelle
Mit Vererbung und dem richtigen Ansatz...
Ich habe leider noch nie ein State Pattern implementiert, sodass das mit dem richtigen Ansatz nicht so leicht ist, vorallem da man im Netz unzählige Varianten der Impementierung findet.

Gruß luciluke

Thema: Befehlszeile (einzelne Chars) mit spezieller Syntax auswerten
Am im Forum: Rund um die Programmierung

Hallo,

ich scheitere im moment an folgender Problemstellung:

es kommen über eine spezielle Tastatur mit vielen Schnelltasten chars rein die ausgewertet werden müßen.
Jeder char kann endweder eine feststehende Bedeutung über die Schnelltasten(jeweils ein Char) haben:
8 Subjekte(zB. Disk, Folder,...), 10 Instructions (z.B. benenne, erstelle,...), 4 Präpostionen (z.B. vor, nach), Andere...
oder aber einfach nur ein Char (abc...usw.) für die Benennung eines Subjekts (z.B. benenne Folder "freier FolderName" vor Folder "vergebener FolderName") oder die Eingabe eines Wertes. Die feststehenden Bedeutungen können nicht mit einzelnen Chars zusammengesetzt werden.
Bei jedem Char Eingang muß ich prüfen, ob der Char im Zusammenhang gültig ist, und wenn nicht einen Hinweis ausgeben und den Char verweigern.
Der Aufbau der Befehlszeilen entspricht meistens folgendem Aufbau: Instruction -> Subjekt -> "Name" -> Präpostion -> "Wert" ,
wobei halt nicht jede Instruction mit jedem Subjekt möglich ist oder bei einer bestimmten Konstellation von Instruction und Subjekt nicht jede Präpostionen erlaubt ist usw.
Jede Befehlszeile wird am Ende mit einem Char "Ausführen" vom Bediener abgeschloßen, um den entsprechenden Befehl auszuführen.

Ich habe versucht das mit if, else, switch, break, return usw. zu bewerkstelligen und gehofft solange den Überblick zu behalten bis alle möglichen Fälle erschlagen sind, aber das war wohl nichts.

Jetzt bin ich schon länger auf der Suche nach einem neuen Lösungsansatz.
Wäre da das State Pattern eine Möglichkeit? Da müßte ich doch für jeden möglichen Zustand der Befehlszeile eine eigene Klasse erstellen (dürften ziemlich viele sein), oder?
Kann man soetwas mir RegEx, Linq, Lambda oder ähnlichem bewerkstelligen?

Ich hänge da jetzt schon mehrere Tage dran und wäre wirklich für jeden hinweis sehr dankbar.
(auch, wenn wohl nicht so wichtig, ich arbeite mit dem Compact Framework 3.5 )

Gruß luciluke

Thema: Komponenten kommunikation
Am im Forum: Rund um die Programmierung

Hallo Rainbird,

irgendwie hänge ich fest, bei dem Versuch meine Anwendung die im Moment auf Basis von Deinem .NET Applikationsserver aufgebaut ist auf Zyan umzustellen.
1. Eine Authentifizierung habe ich mit einem eigenen AuthenticationProvider in zyan hinbekommen
wobei ich hierbei leider nicht wahlweise ipc benutzen kann, da dort dann über ServerSession.CurrentSession.Identity.Name nichts zurückgegeben wird.
die Clientanwendung die auch auf dem server läuft würde ich eigentlich gerne über ipc laufen lassen, bräuchte dann aber trotzdem den Anmeldenamen dieses Clienten.

2. Dann habe ich auch das mit dem PermissionManager aus Rainbird Zyan: Exception versucht, aber hier kommt mein eigentliches Problem.
Wie können sich zwei Serverkomponenten untereinander unterhalten. Die Serverkomponente A möchte gerne von der Serverkomponente B wissen ob ServerSession.CurrentSession.Identity.Name Daten ändern darf. Muß dann jede Serverkomponente eine eigene zyanconnection haben mit Anmeldung, um einen proxy für die jeweilige Komponente zu erstellen?
Bei Deinem .NET Applikationsserver konnte man das ja über die ApplicationServer Klasse machen (ApplicationServer.IsInRole("")) usw.
Das gleiche gilt für eine weitere benötigte Serverkomponente Locking.
Gibt es einen Weg, dass sich zwei Komponenten direkt über ipc unterhalten können?

3. Was muß ich machen, das eine Komponente von unterschiedlichen Clienten wahlweise über ipc tcp oder Http erreichbar sind?
Muß bzw. kann ich eine Komponente in drei hosts registrieren als Singelton.
in etwa so:

TcpCustomServerProtocolSetup protocol1 = new TcpCustomServerProtocolSetup(9003, new ElCashAuthProvider());
HttpCustomServerProtocolSetup protocol2 = new HttpCustomServerProtocolSetup(8000, new ElCashAuthProvider(), true);
IpcBinaryServerProtocolSetup protocol3 = new IpcBinaryServerProtocolSetup("IPCElCashPrintServer");

ZyanComponentHost host1 = new ZyanComponentHost("ElCashPrintServer", protocol1);
ZyanComponentHost host2 = new ZyanComponentHost("ElCashPrintServer", protocol2);
ZyanComponentHost host3 = new ZyanComponentHost("ElCashPrintServer", protocol3);

PrintServer _printServer = new PrintServer();
host1.RegisterComponent<IPrintServer, PrintServer>(_printServer);
host2.RegisterComponent<IPrintServer, PrintServer>(_printServer);
host3.RegisterComponent<IPrintServer, PrintServer>(_printServer);

wobei in PrintServer eine SyncQueue läuft die von mehreren Clients über unterschiedliche protokolle s.o. Daten empfangen und auch einige Daten (DataTables) halten muß.

ps: Ich habe jetzt einmal versucht von KomponenteA mit einer neuen zyanConnection(tcp mit eigenem AuthProvider) auf KomponenteB zuzugreifen.
Das funktioniert auch, nur wenn der host in einer WindowsForm erstellt wird bekomme ich beim erstellen der zyanConnection in der KomponenteA eine CryptoRemotingException "Der Server benötigt eine verschlüsselte Verbindung für diesen Client" (SecureTransactionStage.Uninitialized). Die erste zyanConnection vom entfernten Client selber funktioniert. Mich würde interessieren, wo da der Unterschied ist (host in WindowsForm oder nicht).

Thema: Zyan Communication Framework
Am im Forum: Projekte

Guten Morgen rainbird,

ich muß schon sagen, wenn alles so schnell gehen würde ...
Zyan-Ordner getauscht, Programm läuft.
dann kann ich ja direkt weitermachen.
vielen Dank

Thema: Zyan Communication Framework
Am im Forum: Projekte

Hallo rainbird,

ich versuche gerade eine kleine Anwendung auf Zyan umzustellen, da mir Zyan doch sehr gut gefällt.
Nun bin ich auf folgendes Problem gestoßen.
Es gibt bei mir Methoden, die nicht zwingend alle Parameter brauchen, sodass es auch vorkommt, dass ein Parameter mit NULL übergeben wird.
zB.:
Console.WriteLine(proxyA.GetHelloMessage("a",null));

Dies führt aber nun zu einem Fehler bei

            // Alle Parameter durchlaufen
            for (int i = 0; i < args.Length; i++)
            {
                // Typ in Array einfügen
                types[i] = args[i].GetType();
            }
in Zyan ComponentInvoker.cs

Meine Frage wäre, ob dass so von Dir beabsichtigt nicht möglich ist Null zu übergeben, oder ob es Sinn macht da noch etwas zu ändern.

ps.: Allen ein gutes, glückliches, gesundes und auch erfolgreiches neues Jahr 2011

Thema: Problem mit Dataset.designer.cs in VS2010
Am im Forum: Datentechnologien

Hallo,

ich habe ähnliche Probleme mit n-Tier Datasets in VS 2010. Beim Ausführen des benutzerdefinierten Tools (MSDataSetGenerator) kommt folgende Fehlermeldung:

"Fehler in benutzerdefiniertem Tool: Es konnte kein Code generiert werden. Der Prozess kann nicht auf die Datei "...DataSet.Dataset.Designer.cs" zugreifen, da sie von einem anderen Prozess verwendet wird."
(wobei die Datei defenitiv nicht von einem anderen Process ausser halt wenn von VS verwendet wird)

Das schlimme ist, dass es manchmal geht und manchmal nicht.

Selbst wenn ich die Datei ...DataSet.Dataset.Designer.cs lösche und das Tool erneut ausführe, macht es es meistens nur einmal.

@Kimchi

bist Du bei Deinem Problem schon auf eine Lösung gestoßen?

Gruß

Thema: Fragen, Diskussion, Kritik zu Projekt ".NET Applikationsserver"
Am im Forum: Rund um die Programmierung

Hallo Rainbird,

erstmal allen schöne Weihnachten und einen guten Rutsch ins neue Jahr.

Da ich mich gerade auch mit Deinem Beispiel hier beschäftige, habe ich da mal eine Frage?

Wie Du auch in Deinem Block beschreibst, ist ja der TableAdapter das eigentliche Problem beim generieren durch den Designer.
Wenn ich aber nun nach Erzeugung einer Table durch den Designer (Table aus dem Server-Explorer ziehen), den Adapter, die erzeugte Appconfig Datei, sowie die erzeugte Settingsdatei lösche erhalte ich doch meines Erachtens das gleiche Ergebniss wie durch das Eintippen der Table im Designer.

Liege ich da falsch und es wird doch noch mehr generiert?

ps.: ist schon eine weile her, dass Du mir beim Einstieg in die Programierung sehr geholfen hast und ich hatte danach leider keine weiteren Probleme, die nicht auch selber hier lösen konnte und so wollte ich Dir jetzt halt noch einmal für Deine Hilfestellungen und Beiträge hier im Forum danken.