Datum:
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");
}
}
}
|
Datum:
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.
Datum:
Sorry wird gestartet bricht aber ab...
Datum:
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.
Datum:
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)