www.mikrocontroller.net

Forum: PC-Programmierung C# Thread wird nicht gestartet


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Peter (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Leute habe noch nie mit Threads gearbeitet. Habs einfach mal hier 
ins programm eingebaut aber wird nicht gestartet. Woran könnte es 
liegen?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;



namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        string value = "";
        string uhrzeit;
        string logfile = "";
        bool Datenmodus=false;
                                
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            string[] ports = SerialPort.GetPortNames();
            foreach (string port in ports)
            {
                comboBoxPortname.Items.Add(port);
                comboBoxPortname.SelectedIndex = 0;
            }
            if (COMPORT.IsOpen)
            {
                COMPORT.Close();
            }
            DateTime Now = DateTime.Now;
            uhrzeit = (string.Format("{0:T}", Now)) + " : " + (string.Format("{0:D3}", Now.Millisecond));
            streamwriter(uhrzeit + "  " + "Programm gestartet" + "\r\n");
            rtb.Text = uhrzeit + "  " + "Programm gestartet" + "\r\n" + rtb.Text;


            Thread thread = new Thread(new ThreadStart(DoWork));
            thread.Start();
        }

        private void bt_Daten_Prog_Click(object sender, EventArgs e)
        {
            if (Datenmodus == true)
            {
                COMPORT.Close();
                streamwriter(uhrzeit + "  " + "Comport geschlossen" + "\r\n");
                rtb.Text = uhrzeit + "  " + "Comport "+COMPORT.PortName +" geschlossen" + "\r\n" + rtb.Text;
                if (cb_myavrboard.Checked == true)
                {
                    COMPORT.PortName = comboBoxPortname.Text;
                    COMPORT.BaudRate = 19200;
                    COMPORT.DataBits = 8;
                    COMPORT.StopBits = StopBits.One;
                    COMPORT.Parity = Parity.None;
                    try
                    {
                        COMPORT.Open();
                        if (COMPORT.IsOpen)
                        {
                            COMPORT.Write(new byte[] { 0xE6, 0xB5, 0xBA, 0xB9, 0xB2, 0xB3, 0xA9, 0x70 }, 0, 8);
                            COMPORT.Close();
                        }
                        
                        streamwriter(uhrzeit + "  " + "Umgestellt auf Programmiermodus" + "\r\n");
                        rtb.Text = uhrzeit + "  " + "Umgestellt auf Programmiermodus" + "\r\n" + rtb.Text;
                    }
                    catch
                    {
                        streamwriter(uhrzeit + "  " + "Umstellung in Programmiermodus nicht möglich!" + "\r\n");
                        rtb.Text = uhrzeit + "  " + "Umstellung in Programmiermodus nicht möglich!" + "\r\n" + rtb.Text;
                    }
                }
                bt_Daten_Prog.Text = "Daten-Modus";
                Datenmodus = false;
            }
            else
            {
                
                try
                {
                    COMPORT.PortName = comboBoxPortname.Text;
                    COMPORT.BaudRate = 19200;
                    COMPORT.DataBits = 8;
                    COMPORT.StopBits = StopBits.One;
                    COMPORT.Parity = Parity.None;
                    try
                    {
                        if (cb_myavrboard.Checked == true)
                        {
                            COMPORT.Open();
                            COMPORT.Write(new byte[] { 0xE6, 0xB5, 0xBA, 0xB9, 0xB2, 0xB3, 0xA9, 0x64 }, 0, 8);
                            COMPORT.Close();
                            streamwriter(uhrzeit + "  " + "Umgestellt auf Datenmodus" + "\r\n");
                            rtb.Text = uhrzeit + "  " + "Umgestellt auf Datenmodus" + "\r\n" + rtb.Text;
                        }
                        COMPORT.BaudRate = Convert.ToInt32(tb_baudrate.Text);
                        COMPORT.Open();

                        streamwriter(uhrzeit + "  " + "Comport "+COMPORT.PortName+ " geöffnet" + "\r\n");
                        rtb.Text = uhrzeit + "  " + "Comport " + COMPORT.PortName + " geöffnet" + "\r\n" + rtb.Text;
                        Datenmodus = true;
                        bt_Daten_Prog.Text = "Programmier-Modus";
                        
                        
                    }
                    catch
                    {
                        streamwriter(uhrzeit + "  " + "Comport konnte nicht geöffnet werden!" + "\r\n");
                        rtb.Text = uhrzeit + "  " + "Comport konnte nicht geöffnet werden!" + "\r\n" + rtb.Text;
                    }
                }
                catch
                {
                    streamwriter(uhrzeit + "  " + "Kein Comport ausgewählt!" + "\r\n");
                    rtb.Text = uhrzeit + "  " + "Kein Comport ausgewählt!" + "\r\n" + rtb.Text;
                }
            }
        }


        public void DoWork()
        {
            if (COMPORT.IsOpen)
            {
                value = value + COMPORT.ReadExisting();
            }

            if (value != "")
            {
                string[] lines = Regex.Split(value, "\n");
                foreach (string line in lines)
                {
                    logfile = uhrzeit + "  " + "Empfangen:    " + line + "\r\n";
                    rtb.Text = logfile + rtb.Text;
                    value = "";
                }
            }
        }



        private void bt_reset_rtb_Click(object sender, EventArgs e)
        {
            rtb.Text = "";
        }

        private void bt_senden_Click(object sender, EventArgs e)
        {
            daten_senden(tb_senden.Text);
        }
        private void daten_senden(string data)
        {
            if (COMPORT.IsOpen)
            {
                try
                {
                    COMPORT.Write(data + "\r\n");
                    logfile = uhrzeit + "  " + "Gesendet:     " + data + "\r\n";
                    streamwriter(logfile);
                    rtb.Text = logfile + rtb.Text;
                }
                catch
                {
                    logfile = uhrzeit + "Fehler beim senden" + "\r\n";
                    streamwriter(logfile);
                    rtb.Text = logfile + rtb.Text;
                }
                
            }
        }
        private void streamwriter(string logfile)
        {
            StreamWriter SW = File.AppendText("Logfile.txt");
            SW.Write(logfile);
            SW.Close();
        }

     

        private void timer1_Tick(object sender, EventArgs e)
        {
            DateTime Now = DateTime.Now;
            uhrzeit = (string.Format("{0:T}", Now)) + " : " + (string.Format("{0:D3}", Now.Millisecond));
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            streamwriter(uhrzeit + "  " + "Programm geschlossen" + "\r\n");
        }

    }
  }



Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Peter schrieb:
> aber wird nicht gestartet.

woher weist du da?


public void DoWork() {
    System.Diagnostic.Debug.WriteLine("DoWork start");
[...]
}


würde ich erstmal zur diagnose einbauen.

Autor: Peter (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Sorry wird gestartet bricht aber ab...

Autor: Udo Schmitt (urschmitt)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Habe das Ganze jetzt nur überflogen, aber einen gemeinsamen COMPORT der 
völlig ohne Synchronisation von mehreren Threads benutzt und auch mal 
schnell geschlossen werden kann.
Selbst die Variable value, die in dem Thread als Eingangspuffer genutzt 
wird ist global angelegt.
Schauder.
Bevor du Threads benutzt solltest du erst mal darüber nachdenken was 
passieren kann wenn mehrere Threads gleichzeitig was mit deinen 
Variablen tun wollen
Stichwort "Synchronisation", "Atomare Zugriffe", ...
Les erst mal in dem Buch deines Vertrauens über den Einsatz von Threads, 
sonst endet das im Chaos.

Autor: POTATOOOOHOOHO (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
warum nimmst du für die funktion einen eigenen Thread?

Ich kann Udo nur zustimmen, man muss wissen was Threads sind und was sie 
tun um entweder dem Synchronisationsscheiß aus dem Weg gehn zu können 
oder ihn richtig anzuwenden.

falls dich englisch nicht stört:
http://www.codeproject.com/Articles/26148/Beginner...

ist der erste von 5 Teilen, geht von Grundlagen (teil 1) bis hin zu 
threadpools und ähnlichem (teil5)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net