Laden...

Forenbeiträge von ClaraSoft Ingesamt 55 Beiträge

24.12.2022 - 08:50 Uhr

Hallo Alesia

Wenn man mal davon absieht, dass du den DialogService im if Block zwar anlegst aber nicht zuweist, kann dein Code eigentlich auch nicht in den if Block gelangen da:


isDevice = mobile ? "Mobile" : "Desktop";
if (isDevice == "mobile")

niemals true sein wird, da die strings unterschiedlich sind. Einmal wird 'Mobile' groß geschieben und in der nächsten Zeile klein und dabei ist noch nicht einmal berücksichtig dein Umgang mit strings an dieser Stelle nicht gerade Optimal ist.
Zusätzlich kommt hinzu, dass dein DialogService nur im if Block gültig ist und sonst gibt es diesen nirgends. In C# werden Dependencies meistens über den Klassen Konstruktor als Parameter injected und in eine Klassenvariable gespeichert, dazu muss die Dependency in einem Dependency Container, wie Papst erwähnt hat, registriert werden.

Grüße

25.11.2022 - 19:45 Uhr

Korrigiert mich, aber wäre hier ein Decorator empfehlenswert? Wirkt halt so auf mich, dass das hier durchaus Sinnvoll sein könnte bei deinen Problem @cshw89. Hier sind ein Paar Infos zu dem Design Pattern:
https://www.dofactory.com/net/decorator-design-pattern

31.10.2022 - 12:16 Uhr

Es wird nach jedem Zwischenschritt der ein Ergebnis ausgibt gerundet.

Wenn du nach jedem Zwischenschritt rundest könnten Rundungsfehler entstehen, was das Endergebnis verfälschen könnte. Von daher würde ich tatsächlich auch erst am Ende das Ergebnis runden.

19.09.2022 - 19:00 Uhr

Hallo,

Was für eine Exception bekommst du? Stackoverflow, IndexOutOfRange? Bei deinem geposteten Code Schnippsel sollte es so auf dem ersten Blick keine Performance schwierigkeiten geben bzw. ich kann keine erkennen, wenn es nur "paar tausende" Einträge, was ansich schon sehr schwammig formuliert ist, da wäre eine genaue Zahl hilfreicher genauso wie der Fehler und Stacktrace.

Daneben stellt sich für die Frage, hast du es schon mal der Foreach Schleife probiert?

Grüße

14.09.2022 - 18:10 Uhr

Sind Cron-tab's besser, oder sollte man diese IHostedService-Implementierung bevorzugen?
Ist denke ich ziemlich egal.
Ich würde den BackgroundService nutzen, da der auf allen Plattformen gleich läuft und nicht noch separat im OS konfiguriert werden muss.

Als egal würde ich es nicht abtuen. Über Cron Jobs hast du schon eine relativ gute Kontrolle, die man bei Backgroundservices nicht hat.
Du kannst bei einem Cron Job genau definieren, zu welcher Minute, Stunde, Tag, Monat und Wochentag dieser ausgeführt wird.

21.08.2022 - 08:52 Uhr

Hallo,

Das sind jetzt aber keine echten Bankverbindungsdaten von dir oder sonst wem oder?! Das sind sensible Informationen, die man nicht einfach in ein Forum postet vom Datenschutz mal ganz zu schweigen...

Grüße

18.05.2022 - 13:26 Uhr

Nein, bloß nicht.
Der Private Key sollte nur dem Server bekannt sein. Die Clients brauchen Public Keys.

02.04.2022 - 09:06 Uhr

Guten Morgen

Mein erster Ansatz wäre jetzt Regular Expressions(Regex). Damit kann man schon eine Menge anstellen, was das verarbeiten von Texten/Zeichenketten angeht, damit solltest du auch die Daten aus deiner Datei bekommen.

Grüße

05.01.2022 - 12:25 Uhr

Hallo,

Produces ist wie HttpGet und HttpPost ein Attribut mit einem entsprechenden Parameter.


[Produces("application/json")]

Grüße

21.12.2021 - 09:00 Uhr

Guten Morgen,

Also ich habe auch schon oft darüber nachgedacht wie ich das bei meinen Service machen sollte. Die Idee die Sql Queries in einer txt/sql/json Datei zu hinterlegen hatte ich auch schon. Bin aber letztlich zu dem Schluss gekommen, dass das keine gute Idee ist und zwar aus dem ganz einfachen Grund, das jemand die Datei manipulieren könnte. Die Queries in der Datenbank zu speichern halte aus den selben Grund auch für eine schlechte Idee.

Von Dapper gibt es Beispielsweise einen SQL Builder -> https://www.nuget.org/packages/Dapper.SqlBuilder/
Oder du nutzt wieder ganz klassisch das Entity Framework.

Es gibt sicherlich noch mehr Möglichkeiten das Problem anzugehen.

Grüße

12.12.2021 - 17:15 Uhr

Unity bringt eigentlich sogar schon selbst eine Libary zum bauen einer UI mit. Was spricht dagegen diese zu verwenden?

@Abt Ich glaube das hat sich bisher auch nicht geändert.

29.11.2021 - 17:23 Uhr

Außerdem sehe ich im Debugger, dass das Usercontrol als DataContext das Viewmodel des MainWindow hat und nicht sein eigenes, ich hab aber keine Ahnung, warum das so ist 😦

Hallo,

Du musst dem Usercontrol auch das entsprechende DataContext zuweisen, sonst nutzt das Usercontrol, den DataContext des übergeordneten UserControl bzw. Window.

Grüße

21.11.2021 - 21:24 Uhr

Falls Standardkonstruktor hier missverstanden wird, dann nennen wir es eben parameterlosen Konstruktor.

Ändert aber eben nichts an der Situation.

Es gibt für ToolStripControlHost, laut Doku keinen parameterlosen Konstruktor.

Das hier


base(new CheckBox())

muss gemacht werden, wenn man von ToolStripControlHost erbt.

21.11.2021 - 15:48 Uhr

Der Winforms Designer benutzt ausschließlich Standardkonstruktoren.

Du benutzt

  
base(new CheckBox())  
  

und dies ist kein Standardkonstruktor.

Siehe auch:
>

Laut Doku braucht die Klasse ToolStripControlHost ein Control und/oder ein String im Konstruktor, einen leeren Konstruktor scheint die Klasse nicht zu unterstützten:
ToolStripControlHost Klasse (System.Windows.Forms)

Zumal der Konstruktor von CheckboxStripItem auch leer ist und dementsprechend auch ein Standardkonstruktor sein sollte?

19.11.2021 - 18:04 Uhr

Hallo,

Ich habe selbst bisher noch nie Dependency Property genutzt, auch weil ich eher selten im Codebehind unterwegs bin.
Normalerweise legt man den Datacontext im Rootelement(Window oder UserControl) fest, jedoch kann für fast jedes Element, auch eigene UserControls und Views, ein DataContext festlegen wie hier:


<Window x:Class="MyNamespace.MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        ... />
       <Grid>
              <local:MyDisplayControl DataContext="{Binding  ...}" />
       </Grid>
</Window>

Das Binding könnte z.B. vom View Model der aufrufenden View kommen, sprich das View Model erzeugt eine Instanz von MyDisplayControlViewModel.

Ich hoffe das dich bringt ein wenig weiter.

Grüße

16.11.2021 - 09:35 Uhr

Guten Morgen,

Könnte sein das SchreibeEinstellungen überhaupt nicht aufgerufen wird oder das das Program keine Berechtigung hat in die Registry schreiben, weil sonst sehe ich da keinen Fehler.

Mit der Registry sollte man vorsichtig sein, wenn man nicht weiß was man da macht. Ich würde die Einstellungen eher in eine csv, json oder xml Datei schreiben, statt in die Registry. Daher die Frage müssen die Einstellungen wirklich in der Registry gespeichert werden?

21.10.2021 - 17:10 Uhr

Hallo,

Ich habe über Google übrigens difference-between-selecteditem-selectedvalue-and-selectedvaluepath gefunden. Dort wird der Unterschied zwischen SelectedItem, SelectedValue und SelectedValuePath erklärt. Grob gesagt gibt SelectedItem das ausgewählte Object aus deiner Collection zurück, die an deine Comboxbox gebunden ist. Während SelectedValue und SelectedValuePath angeben auf welchen Wert z.B. die ID, des ausgewählten Objects, gebunden werden soll. Kurz gesagt du sollest deine Bindings hier nochmal überdenken:

  
<ComboBox ItemsSource="{Binding Adresstypenliste}" SelectedItem="{Binding AddData.AdressTyp}" SelectedValue="{Binding AddTyp.Adresstyp}"  SelectedValuePath="{Binding AddData.AdressTyp}" HorizontalAlignment="Left" Height="25" Width="250" >  
                                            <ComboBox.ItemTemplate>  
                                                <DataTemplate>  
                                                    <TextBlock Text="{Binding Adresstyp}" VerticalAlignment="Center" HorizontalAlignment="Left" />  
  

Grüße

18.10.2021 - 13:17 Uhr

In falls keine Exception angezeigt wird, kann man das Programm auch auf dem Win7-Rechner mit dnspy starten und schauen, was dort für Fehler angezeigt werden.

Oder man schaut im eventlog bzw. ereignisanzeige nach ob dort etwas auftaucht. Dort sollte definitiv auch etwas stehen.

Ist auf dem Zielrechner überhaupt .Net installiert?

21.09.2021 - 08:59 Uhr

Guten morgen

Sowas hört man gern. Trotzdem habe ich noch etwas anzumerken und zwar:


static void Main(string[] args)
        {
            Rechteck a = new Rechteck(10, 5);
            Quadrat b = new Quadrat(5);

            a.Umfang();
            a.Flaeche();

            b.Umfang();
            b.Flaeche();
        }

ist zwar in Ordnung aber hier solltest du deine Basisklasse Figur benutzen. Also statt "Rechteck a = new Rechteck(10, 5)", "Figur a = new Rechteck(10, 5)". Nachdem du Umfang und Flaeche den Rechtecks errechnet hast, kannst du a dann zu einem Quadrat machen mit "a = new Quadrat(5)". Alternativ könntest du auch mit einer Liste arbeiten.

Wenn du das gemacht hast sollte dir eigentlich ein Licht aufgehen.

06.07.2021 - 08:05 Uhr

Die Zeitrange ist bewusst 30 Minuten.
Bei manchen Foren ist das auch nur 5. Bei anderen 60. Bei uns aktuell 30.

Interessant, sowas kenne ich aus anderen Foren leider nicht oder ich bin Foren unterwegs wo sowas kein Thema ist. In den meisten Foren in denen ich sonst noch rein schaue, könnte ich eigene Beiträge ewig weiter editieren.

Grüße

18.06.2021 - 21:25 Uhr

Hallo,

Das sieht jetzt mehr wie JSON aus, wenn ich mir das im Browser anschaue.
Versuche jetzt mal statt JObject JArray 🙂

Grüße

18.06.2021 - 11:34 Uhr

Hallo,

Wenn etwas grün angezeigt wird, heißt das die Variable niemals verwendet wird. Auch ist diese Variable immer etwas ausgegraut. Wenn man mit der Maus darüber fährt wird das auch entsprechend im Popup angezeigt. Siehe Bild im Anhang.

Die Lösung wäre es die Variable zu verwenden wie es Alf vorgeschlagen hat, dann wird sie auch nicht mehr grün angezeigt.

Grüße

11.06.2021 - 10:51 Uhr

Hallo,

Hast du dir mal die Klasse Dictionary<Tkey, TValue> angeschaut, damit dürftest du eher ans Ziel zu kommen, weil du dann dein Tuple nicht mehr in einer Liste wrappen müsstest.

Hier die Doku zu Dictionary:
Dictionary<TKey,TValue> Klasse (System.Collections.Generic)

Grüße

09.06.2021 - 07:34 Uhr

oder auf etwas Linq zurückgreifen

Ich denke wenn du auch schon Databinding empfiehlst sollte ich nicht mit Linq anfangen.
Was bedeuten eigentlich diese beiden Pfeile? Ich habe nachgelesen es sind Lambda Expression aber was sagen sie aus?

Mit den geposteten Linqquery kannst alle unchecked Checkbox aus dem Array herausfiltern, so dass nur noch die Checkboxen mit dem entsprechenden Index übrig bleiben, die checked sind.
Wenn dir die Lösung zu komplizierst ist, dann hat Bernd auch schon eine gepostet. Du kannst auch einfach über die Checkbox iterieren und prüfen ob eine Checkbox checked ist oder nicht nicht. Ein Objekt vom Typ Checkbox bsitzt eine boolean Variable Checked, die true oder false sein. Ist der Wert true ist die Checkbox markiert und false dann unmarkiert.

Ich würde das mit einem if machen :

  
CheckBox[] checkboxes = ...;  
for (int i = 0; i < checkboxes.Length; i++)  
    if (checkboxes[i].Checked)  
    {  
         ....  
    }  
  

Grüße Bernd

04.06.2021 - 14:44 Uhr

Steht alles im Link beschrieben, den ich gepostet habe.

04.06.2021 - 13:42 Uhr

Wenn du wirklich ein Plugin System bastelen möchtest, dann solltest du dir noch mal Gedanken über dein Konzept machen. So wie das aktuell ist, kann es nur nach hinten losgehen.

Dein Plugin sollte eine Schnittstelle haben, die das Programm, welches das Plugin nutzen möchte eindeutig versteht. Das kann man Besten über ein Interface machen, das dein Plugin implementiert und dein Programm laden kann. Dann musst auch nicht mehr die Parameter herausfinden, da alles mit einer eindeutigen Schnittstelle bekannt sein sollte für beide Seiten.

Hier noch etwas ausführlicher:
Erstellen einer .NET Core-Anwendung mit Plug-Ins - .NET

01.06.2021 - 21:04 Uhr

Es gibt da sowas das nennt sich Debugger, damit kannst deinen Code zur laufzeit Prüfen und sehen welches Object, welchen Wert gerade hat um das einfach auszudrücken. Desweiteren bekommst du bei einer Execption auch meistens die Info in welcher Zeit der Fehler auftaucht. Vermutlich taucht der Fehler bei den Objecten auf, die du mit null initiallisierst hast, was mich ehrlich gesagt auch nicht wundern wüde.

24.05.2021 - 09:13 Uhr

Bist du sicher dass überhaupt eine Nullstelle berechnet wird?

So wie ich das sehe nein, bzw. er erzeugt 2 mal ein Objekt der Klasse Nullstellen. Einmal in der Methode button1_Click (Zeile 17) und dann in der Methode berechneNullstellen (Zeile 13). Dadurch ist auch kein Wunder das in Zeile 21 nichts zurück kommt, da in dieser Intanz alles 0 ist und auch nix gesetzt wurde. Er müsste eigentlich den Rückgabe Wert aus berechneNullstellen nehmen, das in Zeile 19 aufgerufen wird. Ob das dann funktioniert ist dann eine andere Frage.

Grüße

18.05.2021 - 23:28 Uhr

Hallo,

Die Methode GetFileName gibt aus einem gegebenen Pfad, den Dateinamen zurück oder anders gesagt du brauchst kein Aufruf an substring. Hättest du dir den Link angeguckt wäre dir das bestimmt aufgefallen, dort gibt es sogar ein Beispiel, dafür.

Grüße

18.05.2021 - 09:14 Uhr

Mappe ich die Objekte aus der Datenbank auf ein neues Model? DTO: PlanMitKategorie indem ich über die Collections mit einer Schleife drüber gehe und die Werte in eine neue Collection speichere?
Hat jemand einen Denkanstoß wonach ich suchen soll?

Hallo,

Eine Schleife brauchst du eigentich nicht, du kannst die Daten direkt mit der Abfrage in die entsprechende Klasse mappen, mit SQL würde ich z.B. ein JOIN machen, mit Linq geht das auch.

Grüße

07.05.2021 - 23:57 Uhr

Ich würde die Prüfung auf die Länge des MainWindowTitle vor dem Contains machen.
Ist die Länge 0, dann kann man sich das Contains sparen, was du aktuell aber immer machst!
So macht man erst ein Contains, was false liefert nur um dann erst zu merken, dass dort eh nichts drin steh.
Bzw. würde ich anstelle der Länge mit String.IsNullOrEmpty prüfen, damit es klarer ausgedrückt ist.

Tatsächlich könnte man sich den Check auf die Länge des String sparen. Ein Contains liefert auch dann ein false, wenn nix in dem String steht. In seinem Code prüft er zuerst ob eine Zeichenfolge enthalten ist und wenn ja dann wird noch mal die Länge geprüft. Welches dann immer true zurück gibt.

07.05.2021 - 07:45 Uhr

Hallo,

Eine kleine Anmerkungen zu deinen Code
Deine geschachtelte if Anweisung ist Redundant bzw. in dieser Form unnötig. Wenn das MainWindowTitle schon die Zeichenfolge "Programm -" enthält ist auch, auch gleichzeitig die Length größer als 0. Umgekehrt würde das ganze etwas eher Sinn machen. Noch besser wäre folgende Variante:


public async Task<bool> IsClientOnline()
        {

            await Task.Delay(2000);

            foreach (Process p in Process.GetProcesses())
            {

                if (!p.MainWindowTitle.Contains("Programm -") || p.MainWindowTitle.Length == 0)
                {
                     continue; // oder etwas anderes
                }
                 var username = p.MainWindowTitle;
                ClientName.Items.Add(username.Remove(0, 6));
                ClientHandleNr.Items.Add(p.MainWindowHandle);
                return true;

            }

                return false;

        }

03.05.2021 - 18:18 Uhr

Hallo

Last Insert Id hat aber einige Fallstricke die man beachten sollte.
Ich habe das bei mir lokal auf Php My Admin ausprobiert. Zum Beispiel habe ich nur dann eine ID bekommen, wenn im gleichen SQL auch z.B. ein Insert durchgeführt habe. Habe dagegen nur:


SELECT LAST_INSERT_ID()

ausgeführt kam bei mir eine 0 zurück. Bedeutet LAST_INSERT_ID nur dann die korrekte ID zurück gibt, wenn du bei Query mit der selben Verbindung ausführst. Dann musst du sicher stellen, das dir niemand dazwischen funkt mit einem Insert oder Update.

Eventuell wäre ein Insert select eine bessere und sichere Variante. https://mariadb.com/kb/en/insert-select/

Grüße

29.04.2021 - 22:52 Uhr

Hallo,

Json parsen ist eigentlich kein Hexenwerk, außer man heißt Rockstar. Ich würde das Json erstmal vernüftig formattieren, damit ich besser sehen, was für Keys vorhanden sind, dazu eine passende Modelklassen erstellen/erzeugen.

Grüße

20.04.2021 - 15:48 Uhr

Ich habe so den Verdacht das die XML Dateien leicht unterschiedlich aufgebaut sind und manchmal Werte vorkommen und manchmal halt nicht. Ich denke der Fehler auch schon ab einer Datei auftauchen wird und zwar dann, wenn es kein "Displacement" Wert in der XML Datei gibt. Hast du mal jede XML Datei einzeln geprüft und eingelesen?

18.04.2021 - 19:41 Uhr

Hallo,

Ich weiß weder was deine Consolenanwendung macht noch wofür du sie brauchst, noch ist mir nicht ganz klar was mit du mir "HTML-String" meinst, Hyperlink zu einer Website vielleicht?
Darüber mehr zu erfahren wäre nicht schlecht, damit man dir besser helfen kann, deine Codezeile sagt rein gar nix aus.

15.04.2021 - 19:36 Uhr

Hallo,

Die ComboBox hat die Property SelectedIndex. Hast du es mal damit versucht?

Grüße

10.04.2021 - 13:24 Uhr

Ich würde dir eher zu WPF mit MVVM raten, da kommst du gar nicht erst in die Situation GUI Elemente im Code zu erzeugen, da die Ganze GUI mit XAML erzeugt/erstellt wird.

25.03.2021 - 10:01 Uhr

Hallo,

Gibt es zur der Exception auch ein Stacktrace? Und wie baust du den die Verbindung zur Datenbank auf, dein Login Objekt scheint zwar eine MySqlConnection zu haben, aber wie sieht der Connection State aus, ist der auf Closed? Ist der string externalip gesetzt?

Außerdem solltest du noch mal dein SQL Befehl anpassen. Statt mit * solltest du die Spalten explizit angeben, diesem Fall wäre das username und group. Ganz davon abgesehen solltest du noch ein Try Catch Block einbauen.

Ich würde dir mal empfehlen dir mal Dapper anzugucken.

Grüße

14.02.2021 - 13:22 Uhr

Hallo,

Ich habe die Methode inzwischen etwas umgeschrieben. Die gegenüberliegenden Ampeln sollten synchron miteinander laufen. Die Methode GetCurrentComtrolles() gibt die jeweils gegenüberliegenden Ampeln zurück je nachdem wie der wert von isNorthSouth ist. Dadurch werden jetzt bei jedem Event nur 2 Ampeln geschaltet außerdem habe ich nun einen kurzen Augenblick wo alle Ampeln Rot sind.

Eigentlich ist das Thema abgeschlossen, weil mein eigentliches Problem gelöst ist.


 private void ElapsedEvent(object send, System.Timers.ElapsedEventArgs args)
        {
            try
            {
                var controllers = GetCurrentControllers();
                foreach (var item in controllers.Select((v, i) => new { controller = v, index = i }))
                {
                    switch (item.controller.CurrentPhase)
                    {
                        case TrafficPhase.RedPhase:
                            item.controller.SwitchPhase(TrafficPhase.RedYellowPhase);
                            FireEvent(item.controller, "Activate redsignal and yellowsignal");
                            timer.Interval = 2000;
                            break;
                        case TrafficPhase.RedYellowPhase:
                            item.controller.SwitchPhase(TrafficPhase.GreenPhase);
                            FireEvent(item.controller, "Activate greensignal");
                            timer.Interval = 10000;
                            break;
                        case TrafficPhase.YellowPhase:
                            item.controller.SwitchPhase(TrafficPhase.RedPhase);
                            FireEvent(item.controller, "Activate redsignal");
                            if(item.index == 0) 
                            {
                                isNorthSouth = !isNorthSouth;
                            }
                            timer.Interval = 1000;
                            break;
                        case TrafficPhase.GreenPhase:
                            item.controller.SwitchPhase(TrafficPhase.YellowPhase);
                            FireEvent(item.controller, "Activate yellowsignal");
                            timer.Interval = 2000;
                            break;
                        default:
                            break;
                    }
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception: {ex}");
                throw;
            }
        }

14.02.2021 - 09:57 Uhr

Hallo

Mir fallen spontan 2 Punkte auf, die etwas komisch sind. Du liest den Filestream in der Load Methode nie. Und zum anderen könnte es bei deiner Save und deiner Load Methode knallen, wenn das Array kleiner ist als die die Schleifen durchläufe -> IndexOutOFRangeException. for schleifen sollten idr so aussehen:


for(int i =0; i < myArray.Length; i++) 
{
 // your code...
}

Daneben würde ich bei Load das Array zurück geben statt, als zu referenz übergeben. Und selbst wenn du lasse so lassen möchtest gib wenigstens ein boolean zurück, aber nicht void.

Grüße

13.02.2021 - 20:20 Uhr

😭

Danke Abt, das war der entscheidene Hinweis. Ich hab mein Code um eine try/catch blog erweitert und es kam der erwartete Fehler im log.

Danke euch für eure Hilfe.

13.02.2021 - 19:06 Uhr

Hallo,

Ja das ist prinzipel richtig. Die foreach schleife habe ich, weil die Ampelanlage 4 Ampeln steuern soll, diese habe ich aktuell in einem Dictionary drin. Um die Phase zu wechseln muss ich einmal alle Ampeln aufrufen.

Ich habe im groben folgende Klassen:* Klasse für ein Lichtsignal mit den Properties für die Farbe, Status und Pin

  • Klasse für eine Ampel mit 3 Lichtsignale für Rot, Gelb und Grün
  • Controller Klasse für eine Ampel
  • Klasse welche die Gesamtanlage steuert und die Controller Klassen aktuell in einem Dictionary hält

Mein geposteter Code ausschnitt kommt aus der letzten Klasse.

@T-Virus:

Ja Laut Konsolen ausgabe scheint er nur einmal durch die Schleife zu gehen.
Log mit aktiven Switch Case:


Key count: 4
Current Key: North
Phase: RedPhase
Controller: ef0d21a7-c71d-4f72-9a1d-787afbc523f9
Controller: ef0d21a7-c71d-4f72-9a1d-787afbc523f9 send message: Activate redsignal and yellowsignal and has phase: RedYellowPhase
Key count: 4
Current Key: North
Phase: RedYellowPhase
Controller: ef0d21a7-c71d-4f72-9a1d-787afbc523f9
Controller: ef0d21a7-c71d-4f72-9a1d-787afbc523f9 send message: Activate greensignal and has phase: GreenPhase

Log ohne Switch Case:


Key count: 4
Current Key: North
Phase: RedPhase
Controller: 6d48cfb3-32e6-4e91-84a8-9e0419201c01
Current Key: East
Phase: RedPhase
Controller: 59b02032-bcca-44d2-990f-07b1dfd99476
Current Key: South
Phase: RedPhase
Controller: b7736796-010f-437d-9ebf-482e73622941
Current Key: West
Phase: RedPhase
Controller: 83581af1-15b4-4e2f-b81c-d00b9208ce46
Key count: 4
Current Key: North

Das läuft Übrigens auf dem Raspberry.

13.02.2021 - 16:57 Uhr

Hallo

Ich bin gerade dabei eine Ampelsteuerung für mein Raspberry PI zu programmieren. Jetz bin ich auf ein Problem gestoßen, das ich irgendwie nicht verstehe. Von meinen Timer wird folgendes aufgerufen:


private void ElapsedEvent(object send, System.Timers.ElapsedEventArgs args)
        {
            var keys = currentPhase.Keys;
            Console.WriteLine($"Key count: {keys.Count}");
            foreach (var key in keys)
            {
                Console.WriteLine($"Current Key: {key}");
                var phase = currentPhase[key];
                var controller = trafficLightControllers[key];
                Console.WriteLine($"Phase: {phase}");
                Console.WriteLine($"Controller: {controller.ControllerGuid}");
                switch (phase)
                {
                    case TrafficPhase.RedPhase:
                        currentPhase[key] = controller.SwitchPhase(TrafficPhase.RedYellowPhase);
                        MachineStateEventHandler?.Invoke(this, new MachineStateEventArgs("Activate redsignal and yellowsignal", currentPhase[key], controller.ControllerGuid));
                        timer.Interval = 2000;
                        break;
                    case TrafficPhase.RedYellowPhase:
                        currentPhase[key] = controller.SwitchPhase(TrafficPhase.GreenPhase);
                        MachineStateEventHandler?.Invoke(this, new MachineStateEventArgs("Activate greensignal", currentPhase[key], controller.ControllerGuid));
                        timer.Interval = 10000;
                        break;
                    case TrafficPhase.YellowPhase:
                        currentPhase[key] = controller.SwitchPhase(TrafficPhase.RedPhase);
                        MachineStateEventHandler?.Invoke(this, new MachineStateEventArgs("Activate redsignal", currentPhase[key], controller.ControllerGuid));
                        timer.Interval = 5000;
                        break;
                    case TrafficPhase.GreenPhase:
                        currentPhase[key] = controller.SwitchPhase(TrafficPhase.YellowPhase);
                        MachineStateEventHandler?.Invoke(this, new MachineStateEventArgs("Activate yellowsignal", currentPhase[key], controller.ControllerGuid));
                        timer.Interval = 2000;
                        break;
                    default:
                        Console.WriteLine($"Undefined: {key} or {phase}");
                        break;
                }
            }
        }

Das Problem ist jetzt das der Switch Case dafür sorgt das die Foreach Schleife nicht richtig durchlaufen wird. Es wird immer nur das erste Element durchlaufen.
Der Sowohl currentPhase als auch trafficlightControllers sind Dictionarys mit dem selben Key Typ.
Nehme ich den Switch case raus, funktioniert meine Foreachschleife Problemlos. Im www konnte dazu nix finden. Ich wollte einfach wissen ob das verhalten richtig mit dem Switch Case und der Foreach Loop richtig ist.

10.02.2021 - 15:29 Uhr

Ist das nur zur Übung gedacht oder soll das Irgendwo eingesetzt werden?
Fals letzteres zutrifft lass es bleiben und setze implementiere z.B. RSA oder AES oder etwas vergleichbares, dafür gibt es fertige Libarys.

Zu deinem Code:
Versuche weniger globale Variablen zu nutzen.
Sowohl die Crypt als auch die Decrypt Methode sollten statt void etwas zurück geben und einen Übergabe Parameter haben.

Hier mal ein Beispiel wie so eine Methode aussehen könnte:


public int Calculate(int x, int y)
{
     return x * y;
}

Die Methode erwartet 2 ints und gibt das Ergebnis zurück.

21.01.2021 - 22:58 Uhr

Zum Beispiel könntest du eine Zeile (Spalte, Diagonale) komplett durchlaufen, dir merken wie viele gleiche Farben du bis zur aktuellen Position schon hintereinander gefunden hast und wenns die vierte mit gleicher Farbe ist, ist das Spiel zu Ende.

In meinen Vier gewinnt Spiel, zähle ich die gefunden Steine. Sind 4 gefunden springe ich raus.
Den Counter zurücksetzen tue ich nach jeder Spalte oder wenn ich eine andere Farbe gefunden habe

Hier meine umsetzung für den Vertikal Check.


private GameStatus CheckVertical(FieldStatus coincolor, FieldStatus[,] fieldstatus)
        {
            int counter = 0;
            for (int col = 0; col <= 6 ; col++)
            {
                for (int row = 0; row <= 5; row++)
                {
                    if (fieldstatus[row, col] == coincolor)
                    {
                        counter++;
                    }
                    if (fieldstatus[row, col] != coincolor)
                    {
                        counter = 0;
                    }
                    if (counter == 4)
                    {
                        return GameStatus.GameFinished;
                    }
                }
                counter = 0;
            }
            return GameStatus.UserEnabled;
        }

18.01.2021 - 22:37 Uhr

Hallo,

Mein Ansatz wäre das IValueConverter Interface zu implementieren.

Grüße

14.01.2021 - 21:15 Uhr

Ich nutze Dependency Injection um meinen Logger zu bekommen. Dafür nutze ich das Interface ILogger<T>, was eigentlich sogar der standard Weg ist bzw sein sollte. Den kann ich sogar mit NLog konfigurieren. Ob der auch mit Serilog konfigurierbar ist weiß ich nicht.


private readonly ILogger<MqttSubcriptionWorker> logger;

public MqttSubcriptionWorker(ILogger<MqttSubcriptionWorker> logger)
{
    this.logger = logger;
}

14.01.2021 - 10:36 Uhr

Ich habe ein paar Änderungen durchgeführt. Unter anderem habe die AddPayload Methode umgeschrieben. Außerdem prüfe nun die länge des übergebens byte Arrays, ist dieses zu kurz werf ich eine exception. Ein zu kurzes Array kann gar nicht geparsed werden, da es nicht mal dem Header entsprechen kann... Bleibt nur das Problem, wie ich mit längenmässig validen und erfolgreich geparsten header umgehen, soll die trotzdem verkehrt sind. 🤔

/edit Ich habe das parsing der Enums für den Header etwas verbessert, Ich prüfe nun vorher mit IsDefined ob der Value überhaupt im Enum existiert.