C# Thread wird nicht gestartet

Gast #2662587
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?
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Windows.Forms;
9
using System.IO.Ports;
10
using System.Threading;
11
using System.IO;
12
using System.Text.RegularExpressions;
13

14

15

16
namespace WindowsFormsApplication1
17
{
18
    public partial class Form1 : Form
19
    {
20
        string value = "";
21
        string uhrzeit;
22
        string logfile = "";
23
        bool Datenmodus=false;
24
                                
25
        public Form1()
26
        {
27
            InitializeComponent();
28
        }
29

30
        private void Form1_Load(object sender, EventArgs e)
31
        {
32

33
            string[] ports = SerialPort.GetPortNames();
34
            foreach (string port in ports)
35
            {
36
                comboBoxPortname.Items.Add(port);
37
                comboBoxPortname.SelectedIndex = 0;
38
            }
39
            if (COMPORT.IsOpen)
40
            {
41
                COMPORT.Close();
42
            }
43
            DateTime Now = DateTime.Now;
44
            uhrzeit = (string.Format("{0:T}", Now)) + " : " + (string.Format("{0:D3}", Now.Millisecond));
45
            streamwriter(uhrzeit + "  " + "Programm gestartet" + "\r\n");
46
            rtb.Text = uhrzeit + "  " + "Programm gestartet" + "\r\n" + rtb.Text;
47

48

49
            Thread thread = new Thread(new ThreadStart(DoWork));
50
            thread.Start();
51
        }
52

53
        private void bt_Daten_Prog_Click(object sender, EventArgs e)
54
        {
55
            if (Datenmodus == true)
56
            {
57
                COMPORT.Close();
58
                streamwriter(uhrzeit + "  " + "Comport geschlossen" + "\r\n");
59
                rtb.Text = uhrzeit + "  " + "Comport "+COMPORT.PortName +" geschlossen" + "\r\n" + rtb.Text;
60
                if (cb_myavrboard.Checked == true)
61
                {
62
                    COMPORT.PortName = comboBoxPortname.Text;
63
                    COMPORT.BaudRate = 19200;
64
                    COMPORT.DataBits = 8;
65
                    COMPORT.StopBits = StopBits.One;
66
                    COMPORT.Parity = Parity.None;
67
                    try
68
                    {
69
                        COMPORT.Open();
70
                        if (COMPORT.IsOpen)
71
                        {
72
                            COMPORT.Write(new byte[] { 0xE6, 0xB5, 0xBA, 0xB9, 0xB2, 0xB3, 0xA9, 0x70 }, 0, 8);
73
                            COMPORT.Close();
74
                        }
75
                        
76
                        streamwriter(uhrzeit + "  " + "Umgestellt auf Programmiermodus" + "\r\n");
77
                        rtb.Text = uhrzeit + "  " + "Umgestellt auf Programmiermodus" + "\r\n" + rtb.Text;
78
                    }
79
                    catch
80
                    {
81
                        streamwriter(uhrzeit + "  " + "Umstellung in Programmiermodus nicht möglich!" + "\r\n");
82
                        rtb.Text = uhrzeit + "  " + "Umstellung in Programmiermodus nicht möglich!" + "\r\n" + rtb.Text;
83
                    }
84
                }
85
                bt_Daten_Prog.Text = "Daten-Modus";
86
                Datenmodus = false;
87
            }
88
            else
89
            {
90
                
91
                try
92
                {
93
                    COMPORT.PortName = comboBoxPortname.Text;
94
                    COMPORT.BaudRate = 19200;
95
                    COMPORT.DataBits = 8;
96
                    COMPORT.StopBits = StopBits.One;
97
                    COMPORT.Parity = Parity.None;
98
                    try
99
                    {
100
                        if (cb_myavrboard.Checked == true)
101
                        {
102
                            COMPORT.Open();
103
                            COMPORT.Write(new byte[] { 0xE6, 0xB5, 0xBA, 0xB9, 0xB2, 0xB3, 0xA9, 0x64 }, 0, 8);
104
                            COMPORT.Close();
105
                            streamwriter(uhrzeit + "  " + "Umgestellt auf Datenmodus" + "\r\n");
106
                            rtb.Text = uhrzeit + "  " + "Umgestellt auf Datenmodus" + "\r\n" + rtb.Text;
107
                        }
108
                        COMPORT.BaudRate = Convert.ToInt32(tb_baudrate.Text);
109
                        COMPORT.Open();
110

111
                        streamwriter(uhrzeit + "  " + "Comport "+COMPORT.PortName+ " geöffnet" + "\r\n");
112
                        rtb.Text = uhrzeit + "  " + "Comport " + COMPORT.PortName + " geöffnet" + "\r\n" + rtb.Text;
113
                        Datenmodus = true;
114
                        bt_Daten_Prog.Text = "Programmier-Modus";
115
                        
116
                        
117
                    }
118
                    catch
119
                    {
120
                        streamwriter(uhrzeit + "  " + "Comport konnte nicht geöffnet werden!" + "\r\n");
121
                        rtb.Text = uhrzeit + "  " + "Comport konnte nicht geöffnet werden!" + "\r\n" + rtb.Text;
122
                    }
123
                }
124
                catch
125
                {
126
                    streamwriter(uhrzeit + "  " + "Kein Comport ausgewählt!" + "\r\n");
127
                    rtb.Text = uhrzeit + "  " + "Kein Comport ausgewählt!" + "\r\n" + rtb.Text;
128
                }
129
            }
130
        }
131

132

133
        public void DoWork()
134
        {
135
            if (COMPORT.IsOpen)
136
            {
137
                value = value + COMPORT.ReadExisting();
138
            }
139

140
            if (value != "")
141
            {
142
                string[] lines = Regex.Split(value, "\n");
143
                foreach (string line in lines)
144
                {
145
                    logfile = uhrzeit + "  " + "Empfangen:    " + line + "\r\n";
146
                    rtb.Text = logfile + rtb.Text;
147
                    value = "";
148
                }
149
            }
150
        }
151

152

153

154
        private void bt_reset_rtb_Click(object sender, EventArgs e)
155
        {
156
            rtb.Text = "";
157
        }
158

159
        private void bt_senden_Click(object sender, EventArgs e)
160
        {
161
            daten_senden(tb_senden.Text);
162
        }
163
        private void daten_senden(string data)
164
        {
165
            if (COMPORT.IsOpen)
166
            {
167
                try
168
                {
169
                    COMPORT.Write(data + "\r\n");
170
                    logfile = uhrzeit + "  " + "Gesendet:     " + data + "\r\n";
171
                    streamwriter(logfile);
172
                    rtb.Text = logfile + rtb.Text;
173
                }
174
                catch
175
                {
176
                    logfile = uhrzeit + "Fehler beim senden" + "\r\n";
177
                    streamwriter(logfile);
178
                    rtb.Text = logfile + rtb.Text;
179
                }
180
                
181
            }
182
        }
183
        private void streamwriter(string logfile)
184
        {
185
            StreamWriter SW = File.AppendText("Logfile.txt");
186
            SW.Write(logfile);
187
            SW.Close();
188
        }
189

190
     
191

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

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

203
    }
204
  }
#2662687
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.
Gast #2666282
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/Beginners-Guide-to-Threading-in-NET-Part-1-of-n

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren