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 PierreDole
Thema: Womit erstelle ich am besten Live-Diagramme?
Am im Forum: Rund um die Programmierung

Moin, ich möchte ein Diagramm programmieren, das live mit Daten gefüttert wird, 30 mal in der Sekunde. Außerdem ist die Zeitachse auch live, d.h.
ältere Daten sollen aus dem Diagramm herausscrollen.

Was nehme ich dafür?

Canvas war meine erste Idee. Aber macht es Sinn ein Canvas mit Hunderten von Children zu fluten?

Oder doch lieber mit Bitmap arbeiten. Aber da weiß ich nicht, ob der GUI-Thread da mitkommt. Der wird jetzt schon etwas beansprucht.

Oder gibt es da noch eine ganz andere Möglichkeit?

Ahja, das ganze ist in WPF. Wobei auch hier die Frage: bietet C# für grafische Darstellungen etwas besseres an als WPF?

Thema: Image aus dem sichtbaren Bereich eines Grids rotieren
Am im Forum: GUI: WPF und XAML

Moin,

Ich habe eine grafische Drehzahlmesseranzeige mit einem transparten Bereich, in einem Grid, mit den Ausmaßen der Anzeige (Ziffernblatt). Der Anzeigebereich hat die Form eines Halbkreises und wird, je nach Stand, mit einem sich hineindrehenden Image "gefüllt". Funktioniert auch soweit.

Das Problem ist, das Image soll, wenn es außerhalb des Grid ist, nicht angezeigt werden. Wird es aber. :) Wenn ich das Image nicht drehe, sondern in der Position verändere, dann verschwindet der Teil, der nicht im Grid ist.

Scheinbar wird bei der Darstellung nur auf die Position (Margin) geachtet, aber nicht die Rotation. Meine Frage wäre: wie lasse ich ein Image aus dem sichtbaren Bereich eines Grid herausrotieren?

Das hier ist der Code für die Rotation:

public double NeedlePos
        {
            get { return needleRotation.Angle; } // TODO: Type
            set { this.NeedleImage.Dispatcher.Invoke(() => { 
                        switch (GaugeType)
                        {
                            case Type.CIRCULAR:
                                this.needleRotation.Angle = value;
                                break;
                            case Type.LINEAR_HORIZONTAL:
                                needleImage.Margin = new Thickness(value, needleImage.Margin.Top, 0, 0);
                                break;
                            case Type.LINEAR_VERTICAL:
                                needleImage.Margin = new Thickness(needleImage.Margin.Left, value, 0, 0);
                                break;
                        }
                    }); 
                }
        }

        public GaugeUI() : base()
        {
            this.backgroundImage = new Image();
            this.needleImage = new Image();

            this.NeedlePivot = new Point(0, 0);

            this.needleRotation = new RotateTransform();
            TransformGroup transformGroup = new TransformGroup();
            transformGroup.Children.Add(needleRotation);

            this.NeedleImage.RenderTransform = transformGroup;

            this.GaugeType = Type.CIRCULAR;
        }

Thema: Regex: Finde alles zwischen einem @ und einem Whitespace/Ende des Strings
Am im Forum: Rund um die Programmierung

Ja, fand das mit Redex etwas eleganter. :) Aber jetzt komme ich nicht drum herum es mit den String-Funktionen zu lösen. Mir ist aufgefallen, daß die Namen auch Space-Zeichen enthalten können. Somit muss ich alles von @ bis zur Cursor-Position auslesen.

Wie lese ich nun den Index des Cursors aus? Geht das überhaupt?

Und btw. der leere String lang an einem Fehler im ViewModel. Von daher, Redex war gar nicht so falsch, bis auf den fehlenden Ausdruck des Stringendes. Aber das nützt mir ja jetzt auch nichts mehr.

Thema: Regex: Finde alles zwischen einem @ und einem Whitespace/Ende des Strings
Am im Forum: Rund um die Programmierung

Moin,
ich quäle mich gerade mit redex ab und brauche etwas Hilfe. :)

Ich habe eine Liste mit Chat-Usern, bzw deren Namen. Wenn ich in das Input-Feld ein @ schreibe, poppt eine Liste mit den Namen auf. Mit [Tab] gibts dann die Autovervollständigung.

Nun versuche ich gerade alles hinterm @ und einem Space oder dem Ende des Strings auszulesen, um die Namensliste anzupassen.

Naja, ich krieg da immer einen leeren String raus. :)


if(this.viewModel.ChatGlobalText != string.Empty)
                {
                    Regex rx = new Regex(@"\@(.*?)\s");

                    string startsWith = rx.Match(this.viewModel.ChatGlobalText + " ").Value;
                    this.UpdatePlayerNameList(startsWith);
                }

Ich setzte da ein "künstliches" Space hinter dem String, da es ansonsten kracht. Ich weiß nicht, wie man "oder das Ende des Strings" ausdrückt.

Hoffe, jemand kann mir helfen.

Thema: Eine vererbte Klasse in einer Liste finden
Am im Forum: Grundlagen von C#

Das funktioniert. Vielen dank.

Thema: Eine vererbte Klasse in einer Liste finden
Am im Forum: Grundlagen von C#

Moin,

ich habe eine Liste mit dem Datentyp einer Base-Klasse und möchte überprüfen, ob sich ein bestimmtes vererbtes Objekt dieser Base-Klasse in der Liste befindet.

Zum Beispiel:


List<BaseTask> taskList = new List<BaseTask>();

// TaskA, TaskB und TaskC erben von BaseTask.

taskList.Add(new TaskA());
taskList.Add(new TaskB());
taskList.Add(new TaskC());

Bin da etwas ratlos und habe es wie folgt versucht:


if(taskList.Find(task => task.GetType().Name == "TaskA") != null)
// do something

Naja, es klappt nicht. Gibt es da eine andere Möglichkeit?

Thema: Wie finde ich passende Namen für Klassen und Namespaces, vor allem für kleine Helfermethoden?
Am im Forum: Grundlagen von C#

Moin,
ich verschwende sehr viel Zeit damit passende Namen für Namespaces und Klassen zu finden. Habt ihr einen "Trick", mit dem man sich das einfacher machen kann?

Vor allem bei kleinen Methoden, wie die Folgenden, fällt mir nichts ein:

public static int GenerateID()
        {
            var now = DateTime.Now;
            var date = DateTime.MinValue.AddHours(now.Hour).AddMinutes(now.Minute).AddSeconds(now.Second).AddMilliseconds(now.Millisecond);
            return (int)(date.Ticks / 10000);
        }

... oder...

public static bool IsNumeric(string str)
        {
            // wird benütigt, da TryParse eine Referenz verlangt
            float output;

            // versucht den String in ein Float zu parsen und gibt zurück ob der Versuch erfolgreich war
            return float.TryParse(str, out output);
        }
In welche Klasse packt ihr solche Methoden, die quasi von überall her angesprochen werden können? Aus Ratlosigkeit habe ich meine Klasse "Helpers" genannt und da alles reingetan.

Hoffe, ihr könnt mir weiterhelfen, denn für die ganze Namensfinderei gehen bei mir Stunden drauf.

Thema: Wie kann ich Thread-Safe auf eine gemeinsame Dll zugreifen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Nun gehts.

private int GetInt(string command)
        {
            lock(this)
            {
                UODLL.SetTop(UOHandle, 0);
                UODLL.PushStrVal(UOHandle, "Get");
                UODLL.PushStrVal(UOHandle, command);
                var result = UODLL.Execute(UOHandle);
                if(result == 0)
                    return UODLL.GetInteger(UOHandle, 1);
                else
                    return 0;
            }
        }
Frage mich aber, warum [MethodImpl(MethodImplOptions.Synchronized)] bei mir nicht funktioniert hat. Fände diese Lösung eleganter.

Thema: Wie kann ich Thread-Safe auf eine gemeinsame Dll zugreifen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hab ich doch. :D Aber wie gesagt, [MethodImpl(MethodImplOptions.Synchronized)] funktioniert nicht. Und lock(GetInt) kommt nicht mal an den Compiler heran, wird rot unterstrichen.

Thema: Wie kann ich Thread-Safe auf eine gemeinsame Dll zugreifen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin, mein Programm crasht, wenn ich mit zwei Threads auf eine DLL zugreife und ich kriege das nicht hingebogen. Ist alles noch trail & error, was ich hier mache. :) Es handelt sich hierbei um ein Wrapper, der ursprünglich in Java geschrieben und später von jemandem in C# umgeschrieben wurde.


[MethodImpl(MethodImplOptions.Synchronized)]
        private int GetInt(string command)
        {
            UODLL.SetTop(UOHandle, 0);
            UODLL.PushStrVal(UOHandle, "Get");
            UODLL.PushStrVal(UOHandle, command);
            var result = UODLL.Execute(UOHandle);
            if (result == 0)
                return UODLL.GetInteger(UOHandle, 1);
            else
                return 0;
        }

        [MethodImpl(MethodImplOptions.Synchronized)]
        private void SetInt(string command, int value)
        {
            UODLL.SetTop(UOHandle, 0);
            UODLL.PushStrVal(UOHandle, "Set");
            UODLL.PushStrVal(UOHandle, command);
            UODLL.PushInteger(UOHandle, value);
            UODLL.Execute(UOHandle);
        }
So sehen die Methoden aus. [MethodImpl(MethodImplOptions.Synchronized)] kam von mir, bewirkt leider nichts. Kracht nach wie vor an selber Stelle.

Im Java-Original sieht das so aus:
    public synchronized  void pushInteger(int value) {
        game.PushInteger(handle, value);
    }

    public synchronized  int getInteger(int index) {
        return game.GetInteger(handle, index);
    }
Was ist C#'s Gegenstück zu Javas "synchronized"?

Thema: Wie kann ich einen hidden value an ListBox Item anhängen ähnlich der id als "hidden" im HTML?
Am im Forum: GUI: WPF und XAML

Ok, es klapp. Nicht so ganz, wie im Beispiel mit zwei ViewModels, aber mit einem geht das. Auf jeden Fall hat es mein Hidden Value Problem gelöst, da ich vom SelectedItem das entsprechende Objekt zurückbekomme und nicht nur einen Listenindex. :)

Thema: Wie kann ich einen hidden value an ListBox Item anhängen ähnlich der id als "hidden" im HTML?
Am im Forum: GUI: WPF und XAML

Drei-Schichten-Architektur: Schreibe gerade alles drauf um.

MVVM: Ist drin. Für Listen nutze ich es aber nicht, da ich die Listen nicht über MVVM zum Laufen bekomme. Im Artikel der Punk 2.4, wie befülle ich da die Liste? Muss ich für jeden Listeneintrag ein Objekt von EmployeeViewModel instanziieren? Diesen Datentyp erwartet nämlich viewModel.Employees.Add.

Thema: Wie kann ich einen hidden value an ListBox Item anhängen ähnlich der id als "hidden" im HTML?
Am im Forum: GUI: WPF und XAML

Moin,
kann man irgendwie eine Art Hidden Value an die ListBox Elemente anhängen, wo ich eine ID hinterlegen kann, ähnlich wie im HTML <input name="xyz" value="test" hidden="1234">?

Ich fülle die Liste mit Personen aus einer Datenbank. Die Liste zeigt mir Vorname und Nachname an. Nun gibt es zwei Hans Müller. Will jetzt wissen, welchen von beiden ich auswähle. Am besten wäre es, wenn ich die ID aus der DB an jedes Element übergeben könnte.

Geht das irgendwie?

Thema: Soll eine statische Variable mit oder ohne "get;" und "set;" verwendet werden?
Am im Forum: Grundlagen von C#

Haha, Exceptions! Da war ja mal was. :D Die hatte ich überhaupt nicht auf dem Radar (obwohl ich ständig welche um die Ohren geworfen bekomme). Ok, notiert!

Das löst mein Problem aber noch nicht vollständig, da Exceptions nur für Fehler und andere Ausnahmen gedacht sind. Was ist aber mit Statusmeldungen? Ich schreibe die gerade auf Events um, aber irgendwie gefällt mir das auch noch nicht ganz. Ist es üblich ein Event durch ein anderes Event zu invoken? Anders komme ich nicht durch die Klassen an die GUI.

Die Youtube-Kanäle sehen sehr interessant aus, aber leider brauche ich alles, aufgrund meines Gehörs, in Textform.

Thema: Soll eine statische Variable mit oder ohne "get;" und "set;" verwendet werden?
Am im Forum: Grundlagen von C#

Danke für eure Antworten. Jetzt habe ich noch mehr Fragen. :)

Habe mir Rx angeschaut aber auch das 3-Schichten-Modell und denke, ich sollte zuerst meinen Code strukturieren bevor ich mich Rx zuwende.

Als ich Artikel zum 3-Schichten-Modell mit ihren kleinen Beispiel-Codes gelesen habe, dachte ich mir, es sei im Grunde einfach. Doch wenn ich dieses Modell auf meinen Code, bzw meine Gedankengänge übertragen möchte, wird es plötzlich kompliziert.

Die nachfolgende Situation/Frage ist exemplarisch dafür, warum ich auf globale Variablen zurückgreife:

Sagen wir, die Daten-Schicht greift auf einen SQL-Server im Netz zu. Dieser geht down und ist nicht erreichbar. Jetzt soll eine Nachricht in der GUI erscheinen a la "Daten-Server down!". Wie kommt diese Nachricht durch die Schichten zur GUI? Oder ich möchte, daß gewisse Vorgänge in der Logik-Schicht eine Nachricht ausgeben. Wie macht man das?
Wenn ich das 3-Schichten-Modell richtig verstanden habe, hat es die GUI-Schicht nicht zu interessieren wie und was die Logik-Schicht macht. Die GUI-Schicht erwartet nur ein Ergebnis. Genauso sieht es mit der Beziehung zwischen der Logik- und der Data-Schicht aus. Die Logik-Schicht weiß nicht woher die Data-Schicht ihr Daten bekommt. Wie bekomme ich also die Fehlermeldung (bzw einen Fehlercode) durch die Klassen zur GUI-Schicht?
Als einziges fällt mir nur ein, eine static Klasse zu schreiben, nennen wir sie "Console", ihr beim Start die Instanz des Labels, in dem die Nachrichten angezeigt werden, zu übergeben, und mittels Console.ShowMessage("Ging nicht/Ging doch/ etc.") von überall im Code darauf zuzugreifen. Damit kennt der gesamte Code die GUI-Schicht, bzw ein Element der GUI, was nicht sein soll (wenn ich es richtig verstanden habe). Wie löst man das?

Thema: Soll eine statische Variable mit oder ohne "get;" und "set;" verwendet werden?
Am im Forum: Grundlagen von C#

Ich bekomme ich eine Liste mit Servernachrichten. Jede neue Nachricht wird am Ende der Liste eingefügt und ich bekomme immer nur die volle Liste. Relevant sind aber immer nur die neuen Nachrichten, die noch nicht überprüft wurden.
Jetzt wollte ich eine Klasse schreiben, mit der ich mir den Zugriff vereinfache und überlege, wie ich das mache. Da ich von mehreren Stellen des Programms auf die Nachrichten zugreife, brauche ich einen Zwischenspeicher für den letzten aufgerufenen Index, quasi den letzten List.Count. Das Naheliegendste erschien mir eine static Variable.

Thema: Soll eine statische Variable mit oder ohne "get;" und "set;" verwendet werden?
Am im Forum: Grundlagen von C#

Moin,
bin gerade am überlegen, wie ich eine static Variable handhabe.

Zum einen kann ich sie gleich definieren:


public static class StaticClass
    {
        public static int myStaticInt = 0;
    }

oder ich arbeite mit get und set und setze sie beim Start in MainWindow():


public static class StaticClass
    {
        public static int myStaticInt { get; set; }
    }

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            StaticClass.myStaticInt = 0;
        }
    }

Für den weiteren Verlauf des Programms ist die Art, wie ich es mache, egal, da ich sie immer nur noch mit StaticClass.myStaticInt aufrufen bzw mit StaticClass.myStaticInt = Wert setzen werde.
Geht es hier mehr als nur um Programmierästhetik? Und welche Form ist die "richtige"?

Thema: Wie bekomme ich ein akkurates Messergebnis für die Dauer eines Screenshots?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Wie gesagt, ich möchte herausfinden, ob die Methode mit Screenshots Informationen zu sammeln überhaupt praktikabel ist. Ich kann mir schon denken, daß es in C++ schneller geht, nur wie viel schneller? Reicht es, um diesen Ansatz zu verfolgen, oder würde er auch in C++ scheitern?

Benchmark.NET schaue ich mir gerne an.

Ob es andere Möglichkeiten gibt, in C# Screenshots zu erstellen, weiß ich nicht. Habe mir viele Beispiele angeschaut, da ich es nicht mit der Bitmap-Klasse machen wollte, fand aber nur diesen einen Weg.

Thema: Wie bekomme ich ein akkurates Messergebnis für die Dauer eines Screenshots?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Bin über meinem Projekt zu Screen Scraping gekommen. Naja, das Ermitteln von Informationen mittels Screenshoting hat mein Programm ziemlich verlangsamt. Jetzt will einfach aus Neugier wissen, wie viel schneller es in C++ ginge, also quasi ob diese Methode überhaupt irgendwo taugt.
Vom Assembler weiß ich, daß er der Schnellste ist. Von daher, da ein Vergleichswert zu bekommen, wäre auch ganz nett.
Daß das ganz nicht 100% genau ist, ist nicht weiter schlimm. Es soll nur als ein Richtwert dienen.

Thema: Wie bekomme ich ein akkurates Messergebnis für die Dauer eines Screenshots?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

In Release Modus ändern sich die Ergebnisse auch nur etwas in den Nachkommastellen.

Mir kam aber die Idee Thread.Sleep zu umgehen und das ganze mit einem Timer zu versuchen. Dieses Mal habe ich nur einen 1p x 1p Screenshot zum Testen genommen, da es sonst etwas zu lang dauern würde.

DispatcherTimer timer = new DispatcherTimer();
        float eTime = 0f;
        float eTimeMin = float.MaxValue;
        float eTimeMax = 0f;
        float timerTicks = 0f;

        public MainWindow()
        {
            InitializeComponent();

            timer.Interval = TimeSpan.FromMilliseconds(50);
            timer.Tick += OnTimerTick;
        }

        private long CreateScreenshot(int width, int height)
        {

            Bitmap bmp = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(bmp);

            this.stopwatch.Reset();
            this.stopwatch.Start();

            g.CopyFromScreen(0, 0, 0, 0, new System.Drawing.Size(width, height));

            this.stopwatch.Stop();

            g.Dispose();

            return stopwatch.ElapsedMilliseconds;
        }

        private void StartButton_Click(object sender, RoutedEventArgs e)
        {
            timer.Start();
        }

        private void OnTimerTick(object sender, EventArgs e)
        {
            this.timerTicks++;

            float tmpTime = CreateScreenshot(1, 1);
            this.eTime += tmpTime;

            if(this.eTimeMin > tmpTime)
                this.eTimeMin = tmpTime;

            if(this.eTimeMax < tmpTime)
                this.eTimeMax = tmpTime;


            this.TextOutput.Text = "Minimum: " + this.eTimeMin + "ms\nAverage: " + Math.Round(this.eTime / this.timerTicks, 2) + 
                "ms\nMax: " + this.eTimeMax + "ms\nTimerTicks: " + this.timerTicks;

            if(timerTicks == 1000)
                timer.Stop();
        }

Die Ergebnisse sind jetzt alle fast gleich.

5ms:
Minimum: 1ms
Average: 9,8ms
Max: 19ms
TimerTicks: 1000

10ms:
Minimum: 1ms
Average: 9,74ms
Max: 19ms
TimerTicks: 1000

20ms:
Minimum: 1ms
Average: 9,94ms
Max: 19ms
TimerTicks: 1000

50ms:
Minimum: 1ms
Average: 9,91ms
Max: 20ms
TimerTicks: 1000

Und noch zum Schluß noch mit einem 100x100 Screenshot und im 10ms Intervall:
Minimum: 1ms
Average: 9,96ms
Max: 20ms
TimerTicks: 1000

Das ganze jetzt nochmal in C++. Und am liebsten auch noch im Assembler, den kann ich aber nicht.

Thema: Wie bekomme ich ein akkurates Messergebnis für die Dauer eines Screenshots?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin,
ich wollte wissen, wie lange C# für die Erstellung eines Screenshot braucht. Dafür habe ich folgenden Test geschrieben:

 private long CreateScreenshot(int width, int height)
        {
            Bitmap bmp = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(bmp);

            this.stopwatch.Reset();
            this.stopwatch.Start();

            g.CopyFromScreen(0, 0, 0, 0, new System.Drawing.Size(width, height));

            this.stopwatch.Stop();
            
            g.Dispose();

            return stopwatch.ElapsedMilliseconds;
        }

        private float Measurement(int width, int height)
        {
            float t = 0;

            for(int i = 0; i < 100; i++)
            {
                t += CreateScreenshot(width, height);
            }
            return t / 100;
        }

        private void StartButton_Click(object sender, RoutedEventArgs e)
        {
            this.TextOutput.Text = "1 x 1 - generated in: " + Measurement(1, 1) + "ms\n";
            this.TextOutput.Text += "1 x 2 - generated in: " + Measurement(1, 2) + "ms\n";
            this.TextOutput.Text += "10 x 10 - generated in: " + Measurement(10, 10) + "ms\n";
            this.TextOutput.Text += "100 x 100 - generated in: " + Measurement(100, 100) + "ms\n";
            this.TextOutput.Text += "1000 x 1000 - generated in: " + Measurement(1000, 1000) + "ms\n";
        }

Da die Länge schwankt, habe ich die Tests jeweils 100 Mal durchlaufen lassen und dann den Durchschnittswert ermittelt.

Das Ergebnis:
1 x 1 - generated in: 15,98ms
1 x 2 - generated in: 15,97ms
10 x 10 - generated in: 16ms
100 x 100 - generated in: 16ms
1000 x 1000 - generated in: 19,56ms

Das kam mir etwas zu langsam vor. Habe als nächstes Thread.Sleep(10); in die for-Schleife getan um zu schauen, ob sich was am Ergebnis ändert.


            for(int i = 0; i < 100; i++)
            {
                t += CreateScreenshot(width, height);
                Thread.Sleep(10);
            }

Ergebnis:
1 x 1 - generated in: 5,53ms
1 x 2 - generated in: 5,66ms
10 x 10 - generated in: 5,59ms
100 x 100 - generated in: 5,49ms
1000 x 1000 - generated in: 20,85ms

Ok, sieht schon besser aus. Wird es noch schneller, wenn ich den Thread 20ms schlafen lasse?

Ergebnis mit 20ms:
1 x 1 - generated in: 12,22ms
1 x 2 - generated in: 12,2ms
10 x 10 - generated in: 12,22ms
100 x 100 - generated in: 12,19ms
1000 x 1000 - generated in: 23,05ms

An diese Stelle war ich schon etwas überrascht, da ich mit gleichbleibenden oder gar kürzeren Zeiten gerechnet habe. Habe den Test natürlich mehrfach wiederholt und bis auf kleine Schwankungen in den Nachkommastellen, tat sich nichts.

Aber gut, schauen wir mal, wie es mit 5ms aussieht:
1 x 1 - generated in: 10,5ms
1 x 2 - generated in: 10,5ms
10 x 10 - generated in: 10,56ms
100 x 100 - generated in: 10,43ms
1000 x 1000 - generated in: 24,43ms

Schneller als mit 20ms, aber langsamer als mit 10ms. Die Frage aller Fragen lautet jetzt: Wie bekomme ich ein akkurates Meßergebnis hin? :)


Und dann wäre noch eine Sache mit dem Garbage Collector. Nach ca 13 Sekunden war der Testdurchlauf vorbei. Auf dem Screenshot im Anhang sieht man, daß der GC erst nach ca 53 Sekunden aufgeräumt hat. Das sind 40 Sekunden. Ist das normal? Ich meine, da ist fast ein 1GB im Speicher, der nicht gebraucht wird und der GC braucht 40 Sekunden um aufzuräumen. Kommt mir etwas lang vor.

Thema: Wie schaffe ich es OOP zu begreifen und zu lernen?
Am im Forum: Rund um die Programmierung

Ja, genau, das erlebe ich sehr oft. Ich sehe Beispiele, die vereinfacht einen Aufbau darstellen und ich mich dann nur frage: wie wende ich das jetzt auf meinen Code an?

Ich habe ein Hud für iRacing erstellt, welcher einige Telemetriedaten anzeigt. Geschwindigkeit, RPMs, Fuel level, Laps, usw. Das Ding berechnet auch die Schaltpunkte und hat einen Spotter (Anzeige, die mir Bescheid gibt wenn ein Auto neben mir fährt, damit ich ihn nicht überm Haufen fahre).
Das ist tatsächlich ein sehr kleines Projekt, da ich alle Daten von einem Wrapper bekomme und sie quasi nur formatiert anzeigen lassen muss. Paar Berechnungen und "Spielereien" sind noch drin und das wars dann auch. Eigentlich wollte ich noch viel mehr reintun, aber dann habe ich die Lust dran verloren, eben wegen dem Code.
Sicherlich könnte man hier vieles in andere Klassen auslagern, mit fehlen aber halt die Ideen und Ansätze wie ich das machen könnte. Ich meine, ich könnte es machen, aber das bringt mich nicht weiter, da ich mich dann frage, ob es in der Form richtig ist oder ich totalen Unsinn fabriziert habe.

Es war nicht arrogant gemeint, vielleicht habe ich mich unglücklich ausgedrückt. Ich habe bei meinen Versuchen über die besagte Sehwelle zu kommen, einige solcher Tutorials angefangen zu lesen. Es kam nur Frust auf.
Ich bin am Programmieren und merke ich komme so nicht weiter, bzw, das ist nicht gut, wie ich es mache und versuche dann Informationen zu finden, die mir weiterhelfen. Wenn ich dann seitenweise lese, was nicht einmal annähend in die Richtung geht, wo sich mein Problem befindet, und ich schon erahne, daß die nächsten zig Seiten auch nicht in diese Richtung gehen werden, dann wird es mit der Zeit für mich demotivierend. Da denk ich mir auch nur: nee, das ist nicht das, was ich suche. Und stelle mir vor, daß es irgendwo im Netz einen Artikel geben muss, der sich genau mit diesem Problem auseinandersetzt. Ich meine, ich bin bestimmt nicht der einzige damit.

Thema: Wie schaffe ich es OOP zu begreifen und zu lernen?
Am im Forum: Rund um die Programmierung

Moin,
ich bin auf der Suche nach guter Lektüre zum Thema Code-Gestaltung. Ich sags mal direkt: ich hasse meinen Code. Ich habe die prozedurale Programmierung gelernt (angefangen in den 90ern und Mitte der 2000er aufgehört) und tue mir heute mit der OOP schwer. Ich komme irgendwie nicht aus der Denkweise / den Mustern der damals erlernten prozeduralen Programmierung heraus. Ich neige dazu alles in einer langen Klasse zu schreiben, und wenn ich eine zweite erstelle, dann wird die genauso lang. 80% der Zeit bin ich am Überlegen, wie ich den Code besser gestalten kann, anstatt zu programmieren. Wie verschachtele ich die Klassen? Wie spreche ich sie an? Von außen! Nein, lieber eine Methode in der Klasse, die mir das fertige Ergebnis der Klasse liefert..... ist zum Verzweifeln

Ich habe schon viele Anläufe hinter mir OOP zu verinnerlichen, komme aber nicht über diese eine Schwelle. Zum einen sind Tutorials sehr demotivierend, da sie immer mit dem Basics anfangen (Was sind Klassen? Was ist Vererbung? usw.) und ich das schon alles kenne (habe allen Ernstes mal ein Java Zertifikat gemacht). Zum anderen finde ich nichts, was mir eben diese eine Frage verständlich beantwortet.
Ich habe mein Projekt ruhen lassen und einige Artikel zum Thema Software Architecture gelesen, die zwar interessant waren, aber auch nur Allgemeinplätzchen gewesen sind.

Und ganz ehrlich, ich weiß nicht mal wonach ich suche. Suche ich nach Software Architecture, nach Design Pattern, Clean Code, oder was ganz anderen?

Ich hoffe, jemand kennt paar Antworten.

Thema: Gibt es die Bitmap Klasse in WPF?
Am im Forum: Grafik und Sound

Vielen Dank,

VS hat System.Drawing nicht zum Projekt hinzugefügt. Musste es per Hand machen. Nun gehts.

Thema: Gibt es die Bitmap Klasse in WPF?
Am im Forum: Grafik und Sound

Moin,
gibt es die Bitmap Klasse in WPF? Ich möchte mit meiner App Screenshots machen können. Alle Beispiele, die ich im Netz finde beinhalten die Bitmap Klasse, selbst die Beispiele auf den Seiten von MS.
Das Ding ist, bei mir unterstricht VS 2017 Bitmap rot und als Quick Action bekomme ich es nur die Optionen eine neue Klasse zu generieren, aber nicht etwas zum "using" hinzuzufügen. Auch Beispiele, in denen die usings schon drin sind, funktionieren nicht. Z.B. wird Imaging in using System.Drawing.Imaging; rot unterstrichen.

Alles sieht danach aus, als müsste es diese Klasse geben, aber mein VS kennt sie nicht.

Thema: Wo und wie speichert man am besten große Datenmengen?
Am im Forum: Datentechnologien

Ich bin sehr überrascht, daß diese Datenmengen nicht viele sind. Ich hatte aber auch nie wirklich davor damit zu tun gehabt. :)

Vielen Dank für eure Einschätzung und Vorschläge. Ich werde mich erstmal in diese Datenbanken einlesen und mir einen Überblick verschaffen.

Thema: Wo und wie speichert man am besten große Datenmengen?
Am im Forum: Datentechnologien

Moin,
ich möchte große Datenmengen speichern und bin mir nicht sicher, wie ich das anstellen soll. Es handelt sich um Telemetriedaten einer Rennsimulation. Es sind zwar nicht viele Daten auf einmal, 10 Datensätze mit ca 10 Zeichen pro Satz, aber ich bekomme sie 60 mal in der Sekunde, bei einer Renndauer von ca 30 Minuten. Das wären 108.000 Einträge, und zwar pro Rennen!

Was eignet sich am besten zum Speichern dieser Daten? Eine Datenbanktabelle wird im Nu riesengroß. Nach 10 Rennen hätte die Tabelle über eine Million Einträge. Oder sollte ich für jedes Rennen eine neue Tabelle anlegen? Dann wird aber die Datenbank irgendwann sehr groß und mit der statistischen Auswertung wäre es auch kompliziert. Da muss es eine bessere Möglichkeit geben.

Apropos Statistik: Wie verfahre ich da am besten? Macht es Sinn die Statistik zur Laufzeit zu berechnen und separat zu speichern?

Und dann würde ich noch gerne wissen, wie ich diese Daten speichere. Daß ich nicht 60 Mal in der Sekunde auf den Speicherort zugreifen sollte, ist mir bewusst (korrigiert mich, wenn ich falsch liege). Es muss also ein Datenpool her. Wie groß sollte er sein, bzw wie oft sollte ich speichern? Ich meine, je öfter ich speichere, desto mehr arbeitet der Rechner und je seltener ich speichere, desto größer die Datenmenge im Speicher. Gibt es da eine Faustformel für ein Optimum?

Thema: TimeSpan.FromSeconds beachtet Punkt und Komma falsch
Am im Forum: Grundlagen von C#

Ja, genau das wars! double.Parse() hat einfach den Punkt weggeparset. Mensch, das Ding macht Sachen... :D

Mit double.Parse(seconds, CultureInfo.InvariantCulture) funktioniert das jetzt wunderbar. Es macht zwar aus dem Punkt ein Komma, aber das kann mir egal sein, wird ja umformatiert. :)

Danke euch!

Thema: TimeSpan.FromSeconds beachtet Punkt und Komma falsch
Am im Forum: Grundlagen von C#

Moin,
ich steh gerade komplett aufm Schlauch. TimeSpan.FromSeconds gibt mir ein Ergebnis zurück, das nicht stimmt und ich komme nicht dahinter, woran es liegen kann. Nicht mal eine Nacht drüber schlafen hat geholfen.

Das ist der Code. An einer anderen Stelle funktioniert er wunderbar, habs von dort copy/pastet. (Der Code kommt aus einer for-Schleife.)


                    string tmpTime_ = TimeSpan.FromSeconds(double.Parse(query["Position", i]["FastestTime"].GetValue())).ToString(@"dd\:hh\:mm\:ss\:fff");
                    Console.WriteLine(query["Position", i]["FastestTime"].GetValue() + " | " + tmpTime_);


Als Ergebnis bekomme ich Folgendes:
124.7740 | 14:10:35:40:000
125.1115 | 14:11:31:55:000
125.5584 | 14:12:46:24:000
125.6810 | 14:13:06:50:000
125.8750 | 14:13:39:10:000
125.9621 | 14:13:53:41:000
126.6092 | 14:15:41:32:000
127.0831 | 14:17:00:31:000
127.2126 | 14:17:22:06:000
127.2812 | 14:17:33:32:000
128.2107 | 14:20:08:27:000
128.5625 | 14:21:07:05:000
135.2246 | 15:15:37:26:000
Erste Spalte sind die Sekunden und die zweite Spalte ist das formatierte Ergebnis. Man sieht schon mit bloßem Auge, daß 124.x Sekunden etwas mehr als 2 Minuten sind. Eigentlich brauche ich das auch nur in Minuten, Sekunden und Tausendstel. Die Tage und Stunden habe ich reingetan, da das Ergebnis seltsam aussah.

Wieso bekomme ich da über zwei Wochen heraus? Ideen, woran das liegen könnte?

Thema: Aus einem Event bezogene Daten in bestimmten Intervallen verarbeiten
Am im Forum: Grundlagen von C#

Ich bin begeistert! Vielen Dank für die Vorschläge, ich habe sie alle beherzigt und den Code umgeschrieben. Dank den Timern und vor allem dem ViewModel läuft alles sehr viel flüssiger, da nicht alles ständig neu gezeichnet wird. Sogar der Spotter funktioniert auf Anhieb. Die CPU-Auslastung ging von 10% auf 0.0% - 0.2% runter (abhängig von der Fahreranzahl auf der Strecke). Wie gesagt, ich bin begeistert!

Noch bin ich nicht ganz fertig. Einiges muss ich noch ändern und ergänzen. Bin aber zumindest auf einen besseren Weg.

Eine Kleinigkeit hätte ich noch. Die ViewModel Datei ist etwas lang geraten und es kommt noch viel mehr rein. Ist das normal, oder kann man die irgendwie auf mehrere Dateien aufteilen, z.B. die Daten, die in den Labels angezeigt werden in eine Datei und alle Farben für Schriften und Hintergründe in eine andere?

namespace iRacingHud.ViewModel
{
    class HudViewModel : BaseViewModel
    {
        private string currentLapTime;
        private string lastLapTime;

        private double airTemperature;
        private double trackTemperature;

        private double throttleBarHeight;
        private double brakeBarHeight;
        private double clutchBarHeight;

        private string rpmLED01Color;
        private string rpmLED02Color;
        private string rpmLED03Color;
        private string rpmLED04Color;
        private string rpmLED05Color;
        private string rpmLED06Color;
        private string rpmLED07Color;
        private string rpmLED08Color;
        private string rpmLED09Color;

        private string shiftFlashlightColor;
        private bool isShiftFlashlightVisible;

        private string gear;

        private int speed;
        private float rpm;

        private string position;
        private string laps;

        private double fuelLevel;
        private double maxFuel;
        private string fuelUsage;

        private bool isSpotterVisible;

        private bool isHudPanelVisible;


        // Methods
        public string CurrentLapTime
        {
            get { return currentLapTime; }
            set
            {
                if(value != currentLapTime)
                {
                    currentLapTime = value;
                    OnPropertyChanged("CurrentLapTime");
                }
            }
        }
        public string LastLapTime
        {
            get { return lastLapTime; }
            set
            {
                if(value != lastLapTime)
                {
                    lastLapTime = value;
                    OnPropertyChanged("LastName");
                }
            }
        }
        

        public double AirTemperature
        {
            get { return airTemperature; }
            set
            {
                if(value != airTemperature)
                {
                    airTemperature = value;
                    OnPropertyChanged("AirTemperature");
                    OnPropertyChanged("AirTrackTemperature");
                }
            }
        }
        public double TrackTemperature
        {
            get { return trackTemperature; }
            set
            {
                if(value != trackTemperature)
                {
                    trackTemperature = value;
                    OnPropertyChanged("TrackTemperature");
                    OnPropertyChanged("AirTrackTemperature");
                }
            }
        }
        public string AirTrackTemperature
        {
            get { return string.Format("{0}°C / {1}°C", AirTemperature, TrackTemperature); }
        }


        public double ThrottleBarHeight
        {
            get { return throttleBarHeight; }
            set
            {
                if(value != throttleBarHeight)
                {
                    throttleBarHeight = value;
                    OnPropertyChanged("ThrottleBarHeight");
                }
            }
        }
        public double BrakeBarHeight
        {
            get { return brakeBarHeight; }
            set
            {
                if(value != brakeBarHeight)
                {
                    brakeBarHeight = value;
                    OnPropertyChanged("BrakeBarHeight");
                }
            }
        }
        public double ClutchBarHeight
        {
            get { return clutchBarHeight; }
            set
            {
                if(value != clutchBarHeight)
                {
                    clutchBarHeight = value;
                    OnPropertyChanged("ClutchBarHeight");
                }
            }
        }


        public string RpmLED01Color
        {
            get { return rpmLED01Color; }
            set
            {
                if(value != rpmLED01Color)
                {
                    rpmLED01Color = value;
                    OnPropertyChanged("RpmLED01Color");
                }
            }
        }
        public string RpmLED02Color
        {
            get { return rpmLED02Color; }
            set
            {
                if(value != rpmLED02Color)
                {
                    rpmLED02Color = value;
                    OnPropertyChanged("RpmLED02Color");
                }
            }
        }
        public string RpmLED03Color
        {
            get { return rpmLED03Color; }
            set
            {
                if(value != rpmLED03Color)
                {
                    rpmLED03Color = value;
                    OnPropertyChanged("RpmLED03Color");
                }
            }
        }
        public string RpmLED04Color
        {
            get { return rpmLED04Color; }
            set
            {
                if(value != rpmLED04Color)
                {
                    rpmLED04Color = value;
                    OnPropertyChanged("RpmLED04Color");
                }
            }
        }
        public string RpmLED05Color
        {
            get { return rpmLED05Color; }
            set
            {
                if(value != rpmLED05Color)
                {
                    rpmLED05Color = value;
                    OnPropertyChanged("RpmLED05Color");
                }
            }
        }
        public string RpmLED06Color
        {
            get { return rpmLED06Color; }
            set
            {
                if(value != rpmLED06Color)
                {
                    rpmLED06Color = value;
                    OnPropertyChanged("RpmLED06Color");
                }
            }
        }
        public string RpmLED07Color
        {
            get { return rpmLED07Color; }
            set
            {
                if(value != rpmLED07Color)
                {
                    rpmLED07Color = value;
                    OnPropertyChanged("RpmLED07Color");
                }
            }
        }
        public string RpmLED08Color
        {
            get { return rpmLED08Color; }
            set
            {
                if(value != rpmLED08Color)
                {
                    rpmLED08Color = value;
                    OnPropertyChanged("RpmLED08Color");
                }
            }
        }
        public string RpmLED09Color
        {
            get { return rpmLED09Color; }
            set
            {
                if(value != rpmLED09Color)
                {
                    rpmLED09Color = value;
                    OnPropertyChanged("RpmLED09Color");
                }
            }
        }

        public string ShiftFlashlightColor
        {
            get { return shiftFlashlightColor; }
            set
            {
                if(value != shiftFlashlightColor)
                {
                    shiftFlashlightColor = value;
                    OnPropertyChanged("ShiftFlashlightColor");
                }
            }
        }
        public bool IsShiftFlashlightVisible
        {
            get { return isShiftFlashlightVisible; }
            set
            {
                if(value != isShiftFlashlightVisible)
                {
                    isShiftFlashlightVisible = value;
                    OnPropertyChanged("IsShiftFlashlightVisible");
                }
            }
        }

        public string Gear
        {
            get { return gear; }
            set
            {
                if(value != gear)
                {
                    gear = value;
                    OnPropertyChanged("Gear");
                }
            }
        }

        public int Speed
        {
            get { return speed; }
            set
            {
                if(value != speed)
                {
                    speed = value;
                    OnPropertyChanged("Speed");
                }
            }
        }
        public float RPM
        {
            get { return rpm; }
            set
            {
                if(value != rpm)
                {
                    rpm = value;
                    OnPropertyChanged("RPM");
                }
            }
        }


        public string Position
        {
            get { return position; }
            set
            {
                if(value != position)
                {
                    position = value;
                    OnPropertyChanged("Position");
                }
            }
        }

        public string Laps
        {
            get { return laps; }
            set
            {
                if(value != laps)
                {
                    laps = value;
                    OnPropertyChanged("Laps");
                }
            }
        }


        public double FuelLevel
        {
            get { return fuelLevel; }
            set
            {
                if(value != fuelLevel)
                {
                    fuelLevel = value;
                    OnPropertyChanged("FuelLevel");
                    OnPropertyChanged("FuelDisplay");
                }
            }
        }
        public double MaxFuel
        {
            get { return maxFuel; }
            set
            {
                if(value != maxFuel)
                {
                    maxFuel = value;
                    OnPropertyChanged("MaxFuel");
                    OnPropertyChanged("FuelDisplay");
                }
            }
        }
        public string FuelDisplay
        {
            get { return string.Format("Fuel\n{0} l / {1} l", FuelLevel, MaxFuel); }
        }
        public string FuelUsage
        {
            get { return fuelUsage; }
            set
            {
                if(value != fuelUsage)
                {
                    fuelUsage = value;
                    OnPropertyChanged("FuelUsage");
                }
            }
        }


        public bool IsSpotterVisible
        {
            get { return isSpotterVisible; }
            set
            {
                if(value != isSpotterVisible)
                {
                    isSpotterVisible = value;
                    OnPropertyChanged("IsSpotterVisible");
                }
            }
        }


        public bool IsHudPanelVisible
        {
            get { return isHudPanelVisible; }
            set
            {
                if(value != isHudPanelVisible)
                {
                    isHudPanelVisible = value;
                    OnPropertyChanged("IsHudPanelVisible");
                }
            }
        }
    }
}