Forum: PC-Programmierung C# Thread wird nicht gestartet


von Peter (Gast)


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
  }

von Peter II (Gast)


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.

von Peter (Gast)


Lesenswert?

Sorry wird gestartet bricht aber ab...

von Udo S. (urschmitt)


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.

von POTATOOOOHOOHO (Gast)


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)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.