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: Arbeitsverzeichnis online spiegeln
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Danke für die Tipps. Das sind sehr interessante Sachen bei. Muss mir das alles aber nochmal genauer anschauen.

Dachte die Projekte auf Github sind immer öffentlich. Scheint jetzt anders zu sein und wäre die leichteste Lösung, denke ich. Aber ein SeaFile Server auf einem RasPi ist auch ein sehr verführerischer Gedanke.

Zur Versionskontrolle:
Jaaa, habe ich eigentlich auch seit Jahren auf meiner imaginären ToDo-Liste. Mir ist auch bewusste, ich sollte das mal lernen. Das Ding ist aber, meine Projekte sind so klein, ich hatte nie den Bedarf eine Version zurückzuspringen, und schiebe es ständig vor mich hin.

Thema: Arbeitsverzeichnis online spiegeln
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Moin,

ich möchte meine Projekte gerne zusätzlich zum lokalem Arbeitsverzeichnis auch online speichern. Ich laß etwas über das Thema und merkte schnell, es gibt viele Möglichkeiten. Fühle mich gerade etwas vom Thema erschlagen. Hat jemand darin Erfahrung und könnte mir einen Tipp geben, wonach ich konkret suchen sollte?

Momentan speichere ich alle meine Daten auf einen USB-Stick und arbeite mal am Desktop-PC und mal am Notebook. Auf beiden läuft sowohl Linux Mint als auch Windows 10. Auf beiden System wird auch programmiert. Oft vergesse ich den Stick zu Hause und wünschte mir dann, ich könnte den aktuellen Stand online runterladen.

Zu Verfügung stehen mir ein eigener (klassischer) Webspace - kein Server, den ich konfigurieren oder etwas drauf installieren könnte - den ich via FTP als Speicherplatz zweckentfermden könnte und Google cloud. Ich möchte es so simple wie möglich halten. Heißt, es soll automatisch hoch- und runtergeladen werden. Versionskontrolle ist nicht nötig. Es genügt mir, wenn die aktuelle Version immer online ist und die lokalen Daten überschrieben werden.

Ich nutze VS Code, da gibt es Remote SSH für, aber ich habe ja keinen Server. Vielleicht gibt es aber was anderes dafür?

Thema: Klasse existiert in zwei Namespaces, aber beide Namespaces existieren nicht
Am im Forum: Grundlagen von C#

Ok, das hat funktioniert. Vielen Dank. Habe nur die Zeile

 <PackageReference Include="System.Drawing.Common" Version="6.0.0" />
hinzugefügen müssen. Kannte ich so aber auch noch nicht.

Tue mir noch etwas schwer. Ist mein erstes C#-Projekt unter Linux und mit VS Code.

In dem Code kommt Color.FromRPG von Avalonia.Media.

Thema: Klasse existiert in zwei Namespaces, aber beide Namespaces existieren nicht
Am im Forum: Grundlagen von C#

Naja, soweit war ich auch schon...

Nun, ich nutze nicht .Net Core 3.0 sondern v6. Alles vorgestern frisch installiert. Muss ich trotzdem jetzt 3.0 installieren?

Thema: Klasse existiert in zwei Namespaces, aber beide Namespaces existieren nicht
Am im Forum: Grundlagen von C#

Moin,

ich versuche gerade den ColorTranslator zu benutzen und laufe in einen Fehler, den ich nicht wegbekomme.

Zitat
The type 'ColorTranslator' exists in both 'System.Drawing.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' and 'System.Drawing.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' [WerkstattOrganizer]csharp(CS0433)

Das ist der Code:


using Avalonia.Media;

namespace WerkstattOrganizer
{
    public static class Utils
    {
        public static Color HexToColor(string hex)
        {
            var color = System.Drawing.ColorTranslator.FromHtml(hex);
            return Color.FromRgb(color.R, color.G, color.B);
        }
    }
}

Das Ding ist jetzt, wenn ich "System.Drawing.Common.ColorTranslator" oder "System.Drawing.Primitives.ColorTranslator" nehme, wird mir gesagt, daß diese Namespaces nicht existieren. Wie wähle ich jetzt eins von beiden aus?

Thema: Exception trotz try-catch
Am im Forum: Grundlagen von C#

Ich habe das nicht programmiert, ich benutze es nur. Es ist ein open-source Client für das uralte Ultima Online, geschrieben in C#. ClassicUO nennt er sich und das Plugin, das ich dazu benutze, ist der ClassicAssist.

Thema: Exception trotz try-catch
Am im Forum: Grundlagen von C#

@Abt:
Ja, das ist etwas komplizierter, als ich es anfangs beschrieben habe. Die eigentliche Ursache liegt in einem Plugin. Ohne das Plugin wurde die Exception nicht geworfen. Irgendwo beißen sich die beiden unter bestimmten Umständen. Nun, das Plugin ist einerseits auch open-source, andererseits hat es mehrere Hundert Klassen. Da die Exception auf den Client verweist, weiß ich nicht wo ich im Plugin suchen sollte. Alleine das Einlesen würde Wochen dauern, die Fehlersuche womöglich Monate.
Von daher ist es jetzt für mich das Naheliegendste die Exception zu umgehen, da die Methode eh nur zur Berechnung einer Amimation von Spielfiguren dient. Ich kann damit leben, wenn mal eine Figur eine Animation nicht mitmacht. Nur der Client sollte nicht dabei crashen.

@Th69:
Ehrlich gesagt: keine Ahnung. Mit Memory und Pointern habe ich mich noch nicht auseinandergesetzt. Ich weiß nur, daß der >>-Operator irgendwas mit verschieben bedeutet, aber ausrechnen und/oder überprüfen kann ich die Rechnung im Code nicht.

Thema: Exception trotz try-catch
Am im Forum: Grundlagen von C#

Habe ich das richtig verstanden, daß wenn ich das Attribut [HandleProcessCorruptedStateExceptions] hinzufüge, dann sollte die Exception gecatcht werden? Leider kann ich die Exception nicht ohne Weiteres rekonstruieren und überprüfen ob es jetzt klappt. Die wird einfach ab und zu geworfen.

Ist das so richtig?


[HandleProcessCorruptedStateExceptions]
        public unsafe AnimDataFrame CalculateCurrentGraphic(ushort graphic)
        {
            IntPtr address = _file?.StartAddress ?? IntPtr.Zero;

            if(address != IntPtr.Zero)
            {
                try
                {
                    IntPtr addr = address + (graphic * 68 + 4 * ((graphic >> 3) + 1));

                    ref AnimDataFrame a = ref Unsafe.AsRef<AnimDataFrame>((void*)addr);

                    return a;
                }
                catch(System.AccessViolationException e)
                {
                    System.Console.WriteLine(e.Message);
                    return default;
                }
            }

            return default;
        }

Thema: Exception trotz try-catch
Am im Forum: Grundlagen von C#

Sorry, mein Edit und Dein Post haben sich überschnitten.

Wenn man MemoryExceptions nicht abfangen kann, gibt es dann wenigstens eine Möglichkeit zu überprüfen, ob auf jene Stelle im Memory gerade zugegriffen werden kann?

Thema: Exception trotz try-catch
Am im Forum: Grundlagen von C#

Moin,

ich habe mir ein Open-Source-Projekt runtergeladen und bekomme da ab und zu eine Exception geworfen. Dachte, ich packe einfach an der Stelle einen try-catch Ausdruck und gut ist. Leider funktioniert das nicht. Da ich selber eigentlich sehr selten try-catch benutze, tue ich mir gerade etwas schwer das richtig zu setzen.

Der Ausnahmefehler kommt immer bei return a, ob mit oder ohne try.

Im Original sieht die Methode wie folgt aus:


public unsafe AnimDataFrame CalculateCurrentGraphic(ushort graphic)
        {
            IntPtr address = _file?.StartAddress ?? IntPtr.Zero;

            if(address != IntPtr.Zero)
            {
                IntPtr addr = address + (graphic * 68 + 4 * ((graphic >> 3) + 1));

                ref AnimDataFrame a = ref Unsafe.AsRef<AnimDataFrame>((void*)addr);

                return a;
            }

            return default;
        }

Das ist mein try-catch Versuch:


public unsafe AnimDataFrame CalculateCurrentGraphic(ushort graphic)
        {
            IntPtr address = _file?.StartAddress ?? IntPtr.Zero;

            if(address != IntPtr.Zero)
            {
                try
                {
                    IntPtr addr = address + (graphic * 68 + 4 * ((graphic >> 3) + 1));

                    ref AnimDataFrame a = ref Unsafe.AsRef<AnimDataFrame>((void*)addr);

                    return a;
                }
                catch(System.AccessViolationException e)
                {
                    System.Console.WriteLine(e.Message);
                    return default;
                }
            }

            return default;
        }

Ist das so richtig?

Edit:
Habe die Exception ganz vergessen.
Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. Dann der Verweis auf die Zeile mit return a.

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.