Laden...

Forenbeiträge von Reaper_97 Ingesamt 13 Beiträge

05.07.2020 - 13:54 Uhr

Danke für die Antwort. Habe noch nicht viel mit Xml gemacht und wusste jz nicht genau was gemeint war. Hab es mal so abgeändert und funktioniert wieder.

public class BossFightReward
    { 
        public int Element { get; set; }
        public Trophys Trophy { get; set; }
        public Difficultys Difficulty { get; set; }

        public enum Difficultys
        {
            Gamma,
            Beta,
            Alpha
        }

        public enum Trophys
        {
            Broodmother,
            Dragon,
            Megapithecus
        }
        public BossFightReward(Difficultys difficulty, Trophys trophy, int element)
        {
            Difficulty = difficulty;
            Trophy = trophy;
            Element = element;
        }
        public BossFightReward()
        {
        }
    }
05.07.2020 - 05:31 Uhr

verwendetes Datenbanksystem: XmlSerializer

Eine Liste der Klasse wird in die datagridview geladen und soll von da aus wieder gespeichert werden falls Änderungen erfolgen. Aber ich bekomme diese Fehler und weiß nicht so weiter.

Fehlermeldung:
"System.InvalidOperationException: "'WindowsFormsApp8.BossFightRewards' kann nicht serialisiert werden, weil dafür kein parameterloser Konstruktor verfügbar ist."

WinForm

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            List<BossFightRewards> rewards = new List<BossFightRewards>();
            rewards.Add(new BossFightRewards(BossFightRewards.Difficultys.Alpha, BossFightRewards.Trophys.Dragon, 2040));
            dataGridView1.DataSource = rewards;
        }

        private void saveToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void loadToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var ofd = new OpenFileDialog();

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                var serializer = new XmlSerializer(typeof(List<BossFightRewards>));
                var reader = new StreamReader(ofd.FileName);
                var input = serializer.Deserialize(reader);
                reader.Close();
                dataGridView1.DataSource = input;
            }
        }

        private void saveToolStripMenuItem2_Click(object sender, EventArgs e)
        {
            var sfd = new SaveFileDialog();
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                var serializer = new XmlSerializer(typeof(List<BossFightRewards>));
                var writer = new StreamWriter(sfd.FileName);

                serializer.Serialize(writer, dataGridView1.DataSource);
                writer.Close();
            }
        }
    }

Extra Klasse.

    class BossFightRewards
    { 
        public int Element { get; set; }
        public Trophys Trophy { get; set; }
        public Difficultys Difficulty { get; set; }

        public enum Difficultys
        {
            Gamma,
            Beta,
            Alpha
        }

        public enum Trophys
        {
            Broodmother,
            Dragon,
            Megapithecus
        }
        public BossFightRewards(Difficultys difficulty, Trophys trophy, int element)
        {
            Difficulty = difficulty;
            Trophy = trophy;
            Element = element;
        }
    }
08.10.2019 - 20:27 Uhr

Ich verstehe alles, nur dass problem waren die threads. Mit denen habe ich bisher noch nicht viel gearbeitet weil es nicht nötig war bei den meisten Sachen. Und davon abgesehen ich habe nicht irgendein Code kopiert oder sonst was. Ich habe nur online eine funktion wieder gesehen die ich vergessen hatte und dass Problem behoben hat was dein Kommentar nicht konnte wie man sieht.

Und wegen dem x gehört nicht hin stimmte auch nicht ganz weil ich einfach dass alte kopiert hatte wo es noch nicht richtig abgeändert war lol. Davon abgesehen mache ich dass alles als Hobby und Arbeite damit nicht.

08.10.2019 - 20:16 Uhr

Es waren nicht immer full quotes aber wenn du meinst.

Da leider keine passende Antwort bisher gekommen ist hatte ich mich den ganzen mittag schlau gemacht und eine passende Lösung gefunden mit weniger Code.

08.10.2019 - 19:56 Uhr

Etwas unsauberer Code; aber aus dem Thread heraus dürfte die UI nicht mehr blockieren oder Anzeichen davon haben.
Die Endlosschleife ist natürlich total unnötig und sollte periodisch erfolgen.

Warum ist die Endlosschleife total unnötig? Ich will ja die Aktuellen werte haben jede x sekunden oder ms?

Der Thread klappt aber nur ohne schleife.

08.10.2019 - 18:58 Uhr

Musst das Abfragen eben in einen Task auslagern.
Im Endeffekt ist es das:
>

Ändert sich nichts ist immer noch nicht nutzbar die Form. Progressbar / Label ändert sich richtig aber nur lade Zeichen über der Form und keine Reaktion auf befehle (zb Button).

using OpenHardwareMonitor.Hardware;
using System;
using System.Threading;
using System.Windows.Forms;

namespace HwMonitor
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        Thread systemInfo;
        private void Form3_Load(object sender, EventArgs e)
        {
            systemInfo = new Thread(new ThreadStart(GetSystemInfo));
            systemInfo.Start();
        }

        public class UpdateVisitor : IVisitor
        {
            public void VisitComputer(IComputer computer)
            {
                computer.Traverse(this);
            }
            public void VisitHardware(IHardware hardware)
            {
                hardware.Update();
                foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this);
            }
            public void VisitSensor(ISensor sensor) { }
            public void VisitParameter(IParameter parameter) { }
        }
        public void GetSystemInfo()
        {
            try
            {
                while (true)
                {
                    var updateVisitor = new UpdateVisitor();
                    var computer = new Computer();
                    computer.Open();
                    computer.CPUEnabled = true;
                    computer.Accept(updateVisitor);
                    for (int i = 0; i < computer.Hardware.Length; i++)
                    {
                        if (computer.Hardware[i].HardwareType == HardwareType.CPU)
                        {
                            for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++)
                            {
                                if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature)
                                {

                                    if (progressBar1.InvokeRequired)
                                    {
                                        progressBar1.Invoke(new Action(GetSystemInfo));
                                    }
                                    else
                                    {
                                        SetProgressBar(computer.Hardware[i].Sensors[j].Name, (float)computer.Hardware[i].Sensors[j].Value);
                                    }
                                }
                            }
                        }
                    }
                    computer.Close();
                    Thread.Sleep(100);
                }                
            }
            catch(ThreadAbortException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        public void SetProgressBar(string name, float value)
        {
            switch (name)
            {
                case "CPU Core #1":
                    progressBar1.Value = (int)value;
                    label1.Text = $"{Math.Round(value, 1)}%";
                    break;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            systemInfo.Abort();
            Console.WriteLine("Thread has been stopped!");
        }
    }
}
08.10.2019 - 18:34 Uhr

So sieht es zwar gut aus aber wenn ich zb alle 4 Kerne abfrage und nicht nur 1 kann man die form nur alle paar sekunden ziehen /minimieren und maximieren etc und kein Button reagiert mehr.

08.10.2019 - 17:10 Uhr

Dass wäre einfach mit dem Timer (1000ms).

Ich habe die versuche mit task etc rausgemacht weil es nicht funktioniert hatte.

using OpenHardwareMonitor.Hardware;
using System;
using System.Windows.Forms;

namespace HwMonitor
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private void Form3_Load(object sender, EventArgs e)
        {
        }

        public class UpdateVisitor : IVisitor
        {
            public void VisitComputer(IComputer computer)
            {
                computer.Traverse(this);
            }
            public void VisitHardware(IHardware hardware)
            {
                hardware.Update();
                foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this);
            }
            public void VisitSensor(ISensor sensor) { }
            public void VisitParameter(IParameter parameter) { }
        }
        public void GetSystemInfo()
        {
            var updateVisitor = new UpdateVisitor();
            var computer = new Computer();
            computer.Open();
            computer.CPUEnabled = true;
            computer.Accept(updateVisitor);
            for (int i = 0; i < computer.Hardware.Length; i++)
            {
                if (computer.Hardware[i].HardwareType == HardwareType.CPU)
                {
                    for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++)
                    {
                        if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature)
                        {
                            SetProgressBar(computer.Hardware[i].Sensors[j].Name, (float)computer.Hardware[i].Sensors[j].Value);
                        }
                    }
                }
            }
            computer.Close();
        }

        public void SetProgressBar(string name, float value)
        {
            switch (name)
            {
                case "CPU Core #1":
                    progressBar1.Value = (int)value;
                    label1.Text = $"{Math.Round(value, 1)}%";
                    break;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            GetSystemInfo();
        }
    }
}
08.10.2019 - 16:04 Uhr

Danke aber dass habe ich mir auch schon angeschaut aber egal was ich versuche es laggt immer noch rum ... Kannst du mir zeigen wie ich es richtig implementiere in meinen Code? Würde mir viel mehr helfen als der Beitrag.

08.10.2019 - 13:29 Uhr

Ja danke dafür aber wie soll ich dass hier machen:?

08.10.2019 - 12:57 Uhr

Ja dass ist mir nicht neu aber habe nie damit gearbeitet.

Kannst du mir bitte helfen damit dass es funktioniert bin neu auf dem Gebiet?

08.10.2019 - 12:15 Uhr

Ja ich hatte es mit einem Timer vorher aber, ich habe es gewechselt weil nicht einmal die Form sich geöffnet hatte.

Trotz des Timers kann reagiert meine WinForm ca nur alle paar sekunden auf einen befehl wie schließen oder bewegen etc.. Kann man dass irgendwie verbessern weil so ist es nicht wirklich nutzbar

08.10.2019 - 04:00 Uhr

Ich will einen eigenen Hardware Monitor für meine PC's erstellen und bin auf einen Thread vom Open Hardware Monitor gestoßen. Alles klappt super falls man nur eine Ausgabe über die Konsole haben will, aber sobald ein Element zb Label oder Progressbar angesteuert werden soll geht auf der Form gar nichts mehr... kein bewegen , schließen usw.

using OpenHardwareMonitor.Hardware;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HwMonitor
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
           
        }
        public class UpdateVisitor : IVisitor
        {
            public void VisitComputer(IComputer computer)
            {
                computer.Traverse(this);
            }
            public void VisitHardware(IHardware hardware)
            {
                hardware.Update();
                foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this);
            }
            public void VisitSensor(ISensor sensor) { }
            public void VisitParameter(IParameter parameter) { }
        }
        public void GetSystemInfo()
        {
            var updateVisitor = new UpdateVisitor();
            var computer = new Computer();
            computer.Open();
            computer.CPUEnabled = true;
            computer.Accept(updateVisitor);
            for (int i = 0; i < computer.Hardware.Length; i++)
            {
                if (computer.Hardware[i].HardwareType == HardwareType.CPU)
                {
                    for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++)
                    {
                        if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature)
                        {
                           SetProgressBar(computer.Hardware[i].Sensors[j].Name, (float)computer.Hardware[i].Sensors[j].Value);
                            //Console.WriteLine($"{computer.Hardware[i].Sensors[j].Name}: {computer.Hardware[i].Sensors[j].Value}\u00B0C\r");
                        }
                    }
                }
            }
            computer.Close();           
        }

        public void SetProgressBar(string name, float value)
        {
            switch(name)
            {
                case "CPU Core #1":                  
                    progressBar1.Value = (int)value;
                    Thread.Sleep(100);
                    label1.Text = $"{Math.Round(value, 1)}%";
                    Thread.Sleep(100);
                    break;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            while (true)
            {
                GetSystemInfo();
                Thread.Sleep(1000);
            }
        }
    }
}