Witam.
Od dłuższego czasu pisze sobie program na palmtopa wykorzystującą komunikację bluetooth do odbioru i wysyłania danych. Program jako tako działa ale został mi jeszcze jeden problem do rozwiązania. Odbiór i wysyłanie danych robię w wątku który tworze w momencie kliknięcia buttona "Start":
private void btnStart_Click(object sender, EventArgs e)
{
lock (this)
{
if (startThreadRunning)
return;
else
startThreadRunning = true;
}
impulses = "ERRTST_1," + txtImpulses.Text + "," + Convert.ToString(Convert.ToDouble(txtImpulses.Text) * 2);
constCounter = Convert.ToDouble(txtMeter.Text);
power = (Convert.ToDouble(lblU1.Text) * Convert.ToDouble(lblI1.Text)
double frequency = (((power * (Convert.ToDouble(txtMeter.Text) / 1000)) / 3600));
double time = 1 / frequency;
__write(impulses, 220); // Thread.Sleep(220);
th = new Thread(new ThreadStart(readimpuls));
th.IsBackground = true;
th.Start();
btnStart.Enabled = false;
btnStop.Enabled = true;
}
Funkcja readimpuls() wygląda tak:
private void readimpuls()
{
string[] arr = null;
//Cursor.Current = Cursors.WaitCursor;
while (!disconnected)
{
try
{
string s = __write("RDERR_", 150); // Thread.Sleep(150);
arr = s.Split(' ');
if (arr.Length != 4 || (arr.Length == 4 && arr[3].Equals("-1")))
{
//Cursor.Current = Cursors.Default;
lock (this)
{
startThreadRunning = false;
th = null;
}
MessageBox.Show("Blad");
btnStart.Enabled = true;
btnStop.Enabled = false;
return;
}
if (arr.Length == 4 && arr[3].Equals("1"))
break;
}
catch
{
}
}
if (arr.Length != 4) // ERROR, ACHTUNG, BLAD!!! :-X
return;
try
{
double energyWZ = ((power * Convert.ToDouble(arr[1])) / 3600);
double failt = ((((Convert.ToDouble(arr[0]) / (constCounter / 1000)) - ((constCounter / 1000) * energyWZ)) / ((constCounter / 1000) * energyWZ)) * 100);
//return failt;
string invoke = Convert.ToString(failt);
btnStart.Enabled = true;
btnStop.Enabled = false;
lblFailt.Invoke(new updateText(UpdateText), invoke);
lock (this)
{
startThreadRunning = false;
th = null;
}
return;
}
catch { }
}
ten wątek działa do momentu aż dostanę taką odpowiedź jaką chcę. Chciałem jednak trochę to rozszerzyć i móc przerywać działanie wątku. Do tego celu stworzyłem sobie buttona "Stop":
private void btnStop_Click(object sender, EventArgs e)
{
if (th != null)
{
try
{
th.Abort();
btnStop.Enabled = false;
btnStart.Enabled = true;
th = null;
startThreadRunning = false;
}
finally
{
lock (this)
{
th = null;
startThreadRunning = false;
}
}
}
impulses = "ERRTST_0,0,0";
__write(impulses, 150); // Thread.Sleep(150);
}
I tu jest problem, ponieważ niby mi przerywa działanie wątku, ale za to całkowicie zawiesza cały program.
Czy ktoś może mi jest w stanie wyjaśnić dlaczego tak się dzieje i ewentualnie pomóc rozwiązać problem. Za wszelką pomoc z góry dziękuję.
Pozdrawiam.