Laden...
A
AceTecNic
myCSharp.de - Member
13
Themen
51
Beiträge
Letzte Aktivität
vor einem Jahr
Dabei seit
23.02.2018
Alter
31
Beruf
Feinwerkmechanikermeister
Herkunft
Bayern
Erstellt vor einem Jahr

Guten Morgen zusammen und dankeschön für die Rückmeldungen!

Die Variante mit dem auslagern in einen extra Thread gefällt mir recht gut. Da der Prüfvorgang mit 60 Sekunden + Wartezeit auf Bedingung (Erreichen des Startwertes) sowieso als längere Aufgabe zählt, werde ich das versuchen so umzusetzen.

Eventuell könnte mir noch jemand einen Tipp geben, wie ich verhindern kann, dass der "Backgroundworker" nicht sofort seine Arbeit beendet?

Ich starte ihn mit einem Button und dieser sollte dann eben in die while-Schleife gehen bis ich den bool zeitVorbei==true setze.

Allerdings wird die Schleife gar nicht erst aufgerufen... Hab ich was übersehen?

Codeschnipsel:

private void InitializeBackgroundWorker()
        {
            backgroundWorker = new BackgroundWorker();
            backgroundWorker.DoWork += BackgroundWorker_Arbeit;
            backgroundWorker.RunWorkerCompleted += BackgroundWorker_WorkerFertig;
            backgroundWorker.ProgressChanged += BackgroundWorker_Fortschritt;
            backgroundWorker.WorkerReportsProgress = true;
        }

        private void StartBackgroundWorkButton_Click(object sender, EventArgs e)
        {
            if (!backgroundWorker.IsBusy)
            {
                // Starte den BackgroundWorker.
                backgroundWorker.RunWorkerAsync();
            }
        }

        private void BackgroundWorker_Arbeit(object sender, DoWorkEventArgs e)
        {
            while (zeitVorbei == false)
            {
                // Diese Methode wird im Hintergrund ausgeführt.
                Console.WriteLine("Worker aktiv");
                if (this.druckkraft_ist < this.startDruck)
                {
                    Console.WriteLine("Schleife klein aktiv");


                }

                if (this.druckkraft_ist > this.startDruck)
                {
                    Console.WriteLine("Schleife groß aktiv");
                    for (int i = 0; i <= 100; i++)
                    {
                        picbox_Klartextanzeige.BackColor = Color.Lime;
                        lbl_Klartextanzeige.BackColor = Color.Lime;
                        lbl_Klartextanzeige.Text = "   Druck erhöhen auf " + this.variablenSpeicher.Druckkraft + " kN\n" + "  Startdruck ist " + this.startDruck + " kN";



                        if (this.druckkraft_ist > this.startDruck)
                        {


                            if (this.druckkraft_ist > druckKraft)
                            {
                                picbox_Klartextanzeige.BackColor = Color.YellowGreen;
                                lbl_Klartextanzeige.BackColor = Color.YellowGreen;
                                lbl_Klartextanzeige.Text = "Druck erhöhen auf " + this.überDruck + " kN";
                            }

                        }
                        backgroundWorker.ReportProgress(i);
                    }
                }

                else
                {
                    Console.WriteLine("Nichts");
                }
                //Thread.Sleep(333);
            }
        }

        private void BackgroundWorker_Fortschritt(object sender, ProgressChangedEventArgs e)
        {
            // Diese Methode wird aufgerufen, wenn der BackgroundWorker den Fortschritt meldet.
            progbar_Prüfzeit.Value = e.ProgressPercentage;
        }

        private void BackgroundWorker_WorkerFertig(object sender, RunWorkerCompletedEventArgs e)
        {
            // Diese Methode wird aufgerufen, wenn der BackgroundWorker seine Arbeit beendet hat.
            if (e.Error != null)
            {
                // Wenn während des Hintergrundprozesses ein Fehler aufgetreten ist.
                MessageBox.Show("Fehler aufgetreten: " + e.Error.Message);
            }
            else
            {
                // Wenn die Aufgabe erfolgreich abgeschlossen wurde, aktualisiere das Label.
                picbox_Klartextanzeige.BackColor = Color.Red;
                lbl_Klartextanzeige.BackColor = Color.Red;
                lbl_Klartextanzeige.Text = "         Prüfung beendet";
            }
        }
Erstellt vor einem Jahr

Okey danke für die Info! Dann werde ich mich mal damit auseinander setzen und die Methode in einem extra Thread laufen lassen.

Dankeschön! 😃

Erstellt vor einem Jahr

Hallo Zusammen,

Benötige wieder einen Denkanstoß

Soll:

Über einen Button wird die "Prüfung" gestartet. Anschließend muss der Anwender eine Maschine Bedienen um den Messwert zu erhöhen. Eine Progressbar soll nach dem erreichen des Startwertes (50) 60s lang laufen. Die Messwerte (3 Werte / Sekunde) werden aufgezeichnet und in einem Graph ausgegeben.

Problem:

Nach dem Klick auf den Button wird der Code darin nicht mehr ausgeführt. Mit einer While-Schleife lege ich auch alles Lahm. Das Pgm soll weiterlaufen. Dabei soll aber auf die Bedingung (Startwert) "gewartet" werden und anschließend weiterer Code ausgeführt werden.

Vielleicht kann mir ja jemand einen Tipp geben, wie ich das angehen kann? 😃

Dankeschön!

Erstellt vor einem Jahr

Hirnknoten gelöst. Vielen Dank!!!

Alter Codeschnipsel:

private Variablenspeicher variablenSpeicher;

Neuer Codeschnipsel:

private Variablenspeicher variablenSpeicher = new Variablenspeicher();
Erstellt vor einem Jahr

Hallo Zusammen,

Ich hänge gerade etwas fest...

Ich möchte in der Variablenspeicher.cs den String 500 fest hinterlegen und bei Bedarf über Einstellungen.cs ändern. (Nur für die Laufzeit des PGM)

Beim übernehmen bekomme ich die Fehlermeldung "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt".

Kann mir jemand einen Tipp geben? 😃

Einstellungen.cs:

namespace Keilprüfprogramm
{
    public partial class Einstellungen : Form
    {

        private Variablenspeicher variablenSpeicher;
        private string startWert;



        public Einstellungen()
        {
            InitializeComponent();
        }

        private void übernehmenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.startWert = txtin_Startwert.Text;
            this.variablenSpeicher.StartDruck = this.startWert.ToString(); //<-- Fehlerstelle
        }

        private void Einstellungen_Load(object sender, EventArgs e)
        {
            try
            {
                startWert = variablenSpeicher.StartDruck;
                txtin_Startwert.Text = startWert;
            }
            catch
            {
                this.txtin_Startwert.Text = "550";
            }

        }

        private void abbrechenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}

Variablenspeicher.cs:

namespace Keilprüfprogramm
{
    /// <summary>
    /// Datenspeicherklasse für alle Variablen
    /// </summary>

    class Variablenspeicher
    {
        private string portName = "COM3";
        private int baudRate = 115200;
        private string vorname;
        private string nachname;
        private string startDruck = "500";


        }

        public string StartDruck { get => startDruck; set => startDruck = value; }
    }
}
Erstellt vor einem Jahr

Vielen Dank Abt! Habe das ganze mit BeginInvoke gemacht und es funktioniert wesentlich besser! Top 🙂

Wilfried: Das funktioniert soweit ganz gut. Warten tut da eigentlich nichts, wenn dann im µSekunden Bereich. Aber für meine drei Messungen/Sekunde reicht das ;D
Danke!

Erstellt vor einem Jahr

Würde mir bitte jemand erklären, wie man ein Event(?) beendet um den Serial.Port ordnungsgemäß zu schließen?

Ich öffne den Port, und bei eingehenden Daten startet DataReceivedHandler. Wenn ich nun btn_PortAbbrechen klicke, sollte dieser ja normalerweise schließen. Das funktionierte bisher relativ gut. Gelegentlich ist das Programm eingefroren allerdings.

Das hier sind Code-Schnipsel, der komplette Code wäre wohl nur unnütz lang:


using System;
using System.IO.Ports;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Drawing;

namespace Schmid_Prüfprogramm
{
    public partial class Schmid_PP : Form
    {
        SerialPort SerialPort = new SerialPort();
        private delegate void threadSicher(string messung);

        //Private Variablen ----------------------------------------------------------------------------------------------------------
        string portName;
        int baudRate = 19200;


        public Schmid_PP()
        {
            //Funktionen die beim Start ausgeführt werden sollen hier rein.
            InitializeComponent();
            fillComPortComBoBox();
            dateTimePicker1.Value = DateTime.Now;
            btnLED_ReferenzStatus.BackColor = Color.Red;

        }

                private void btn_portVerbinden_Click(object sender, EventArgs e)
        {
            try
            {
                SerialPort.PortName = combox_Portliste.SelectedItem.ToString();
                SerialPort.BaudRate = baudRate;
                SerialPort.Open();
                SerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
                Console.WriteLine("Port geöffnet");
                btn_portVerbinden.Enabled = false;
            }
            catch (Exception)
            {
                MessageBox.Show("Keinen Port ausgewählt", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btn_PortAbbrechen_Click(object sender, EventArgs e)
        {
            SerialPort.Close();
            
            lbl_Anzeige.Text = "N.A.";
            lbl_Temperatur.Text = "N.A.";
            btn_portVerbinden.Enabled = true;
        }

        public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            //Console.WriteLine("Daten werden empfangen");
            SerialPort serialPort = (SerialPort)sender;
            string indata = serialPort.ReadLine();
            updateMessung(indata);
        }

        private void updateMessung(string indata)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new threadSicher(updateMessung), new object[] { indata });
            }
        }
    }
}

Ich denke, das nötigste ist mit drin.

Erstellt vor einem Jahr

Vielen Dank!

Genau das war mein Fehler. Jetzt funktioniert das ganze wie es soll 😁

Dankeschön!!

Erstellt vor einem Jahr

Hallo zusammen,

In meiner Anwendung soll die Zeit gestoppt werden, solange eine Lichtschranke aktiv und ein RadioButton gecheckt ist. Solange die Lichtschranke inaktiv ist, soll die Stopwatch pausiert werden und bei Aktivierung wieder weiter laufen. Die Verstrichene Zeit wird ausgegeben wenn die Lichtschranke inaktiv ist. (Alternativ wollte ich das erst anzeigen lassen wenn beispielsweise Messung2 gecheckt wird, aber das ist egal...)

Mein Problem: Die Zeitmessung wird nicht gemacht. Es wird immer nur 00 angezeigt und ich weiß leider echt nicht warum... Hat mir jemand einen Tipp?

Hier meine Funktion in der das ganze geschehen soll:
(Aktuell habe ich natürlich nur die messung1 im Test, später ist das ja nur noch C&P)


        private void updateMessung(string indata)
        {
            
            if (this.InvokeRequired)
            {
                this.Invoke(new threadSicher(updateMessung), new object[] { indata });
            }

            Console.WriteLine("Update Messung gestartet");

            //Ab hier Code der laufen soll sobald der COM-Port verbunden ist und Daten empfängt --------------------------------------------------
            try
            {
                string[] arr = indata.Split('|'); //WinkelWert|Temp|Referenz|Lichtschranke <-- Daten vom Controller
                                                  //Daten werden im Array (arr) gespeichert und mit dem | getrennt. Daten können Blockweise abgerufen werden mit arr[1] arr[2] usw...
                lbl_Anzeige.Text = arr[0] + " °"; //Winkelanzeige Echtzeit

                lbl_Temperatur.Text = arr[1] + " °C"; //Temperaturanzeige        
                
                if (arr[2].Contains("OK")) //Referenzstatus
                {
                    btnLED_ReferenzStatus.BackColor = Color.Green;
                }

                string lichtSchrankeStatus = arr[3];

                //Hier Code der laufen soll wenn ein RadioButton gecheckt ist:-------------------------------------------------------------------
                if (messung1.Checked)
                {
                    Stopwatch stopwatch1 = new Stopwatch();

                    if (lichtSchrankeStatus.Contains("AN"))
                    {
                        stopwatch1.Start();
                        lbl_a011.Text = arr[0];
                    }
                    
                    
                    if (lichtSchrankeStatus.Contains("AUS"))
                    {
                        stopwatch1.Stop();
                        TimeSpan ts1 = stopwatch1.Elapsed;
                        string zeitMessung1 = String.Format("{0:00}",ts1.Seconds);
                        lbl_Zeit11.Text = zeitMessung1;
                    }
                    
                }
                
                else if (messung2.Checked)
                {
                    Timer timer2 = new Timer();
                    timer2.Start();
                    lbl_a021.Text = arr[0];
                }

                else if (messung3.Checked)
                {
                    lbl_a031.Text = arr[0];
                }

                else if (messung4.Checked)
                {
                    lbl_a012.Text = arr[0];
                }

                else if (messung5.Checked)
                {
                    lbl_a022.Text = arr[0];
                }

                else if (messung6.Checked)
                {

                    lbl_a032.Text = arr[0];
                }
            }
            catch
            {
                //Fehlerbehandlung wenn keine oder falsche Daten ankommen
                lbl_Anzeige.Text = "Lädt..";
                lbl_Temperatur.Text = "Lädt..";


                /* ---Alte Version---
                DialogResult result = MessageBox.Show("Fehler bei der Datenübertragung! Erneut versuchen?", "Fehler", MessageBoxButtons.YesNo, MessageBoxIcon.Error);

                if (result == DialogResult.Yes)
                {
                    if (this.InvokeRequired)
                    {
                        this.Invoke(new threadSicher(updateMessung), new object[] { indata });
                    }

                }
                if (result == DialogResult.No)
                {
                    SerialPort.Close();
                    SerialPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
                    lbl_Anzeige.Text = "N.A.";
                    lbl_Temperatur.Text = "N.A.";
                    btn_portVerbinden.Enabled = true;
                }*/
            }
            

            if (rdbtnMessungBeendet1.Checked)
            {
                try
                {
                    string lblGrad1string = lbl_a011.Text;
                    string lblGrad2string = lbl_a021.Text;
                    string lblGrad3string = lbl_a031.Text;
                    decimal lblGrad1dc = Convert.ToDecimal(lblGrad1string);
                    decimal lblGrad2dc = Convert.ToDecimal(lblGrad2string);
                    decimal lblGrad3dc = Convert.ToDecimal(lblGrad3string);
                    decimal lblGradGesamt1dc = ((lblGrad1dc + lblGrad2dc + lblGrad3dc) / 3) / 10;

                    lblGradGesamt1dc = decimal.Round(lblGradGesamt1dc, 1);
                    string lblGradGesamt1String = Convert.ToString(lblGradGesamt1dc);
                    lbl_a01.Text = lblGradGesamt1String;
                }
                catch (Exception)
                {
                    rdbtnMessungBeendet1.Checked = false;
                    MessageBox.Show("Alle Messungen zuerst durchführen!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);

                }

            }
            if (rdbtnMessungBeendet2.Checked)
            {
                try
                {
                    string lblGrad4string = lbl_a012.Text;
                    string lblGrad5string = lbl_a022.Text;
                    string lblGrad6string = lbl_a032.Text;
                    decimal lblGrad4dc = Convert.ToDecimal(lblGrad4string);
                    decimal lblGrad5dc = Convert.ToDecimal(lblGrad5string);
                    decimal lblGrad6dc = Convert.ToDecimal(lblGrad6string);
                    decimal lblGradGesamt2dc = ((lblGrad4dc + lblGrad5dc + lblGrad6dc) / 3) / 10;

                    lblGradGesamt2dc = decimal.Round(lblGradGesamt2dc, 1);
                    string lblGradGesamt2String = Convert.ToString(lblGradGesamt2dc);
                    lbl_a02.Text = lblGradGesamt2String;
                }

                catch
                {
                    rdbtnMessungBeendet2.Checked = false;
                    MessageBox.Show("Alle Messungen zuerst durchführen!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }


        }

Erstellt vor einem Jahr

Denke ich habe schon etwas gefunden:

PictureBox einfügen;
BorderStyle = FixedSingle einstellen;

Fertig.

Danke 🙂