C# Thread'i Geçici Olarak Durdurmak Veya Bekletmek
-
Hocalarım thread yapılarıyla aynı anda 2 adet seri porttan veri almaya çalışıyorum. Aynı anda verileri alabiliyorum ekranda görebiliyorum. Sorunum bu veri alımını durdurup tekrar başlatabilmek.
Bunu thread in içine koyduğum volatile bool olan _devam1 değişkeniyle while'in içine koydum. fakat sıkıntı burda _devam1'i false yapınca herşey çok güzel veri alımı durmuş gibi ekrana hiç bişey yazdırmıyor. ama _devam1'i tekrardan true yapınca daha önce aldığı herşeyi hiç durmamış gibi tekrar ekrana yazıyor.
yani arkaplan thread while döngüsünün içine giriyor bir güzel çalışıyor ama ekrana yazdırmıyor. değişken i tekrar true yapınca hiç durmamış gibi arada gelen verilerin hepsini birden yazıyor.
Kodları pastebin'e attım. anlayamadım noldu ne bitti.
-
şu kodu şuraya yapıştırın aga. pastebin engelli.
-
-
using System;
-
using System.Collections.Generic;
-
using System.ComponentModel;
-
using System.Data;
-
using System.Drawing;
-
using System.Linq;
-
using System.Text;
-
using System.Threading.Tasks;
-
using System.Windows.Forms;
-
using System.IO.Ports;
-
using System.Threading;
-
namespace WindowsFormsApplication1
-
{
-
public partial class Form1 : Form
-
{
-
-
volatile bool _devam1=false, _devam2=false,durum=true;
-
//
-
-
public Form1()
-
{
-
InitializeComponent();
-
-
-
CheckForIllegalCrossThreadCalls = false;
-
-
serialPort1.PortName = "COM3";
-
serialPort1.BaudRate = 9600;
-
serialPort1.DataBits = 8;
-
-
serialPort2.PortName = "COM5";
-
serialPort2.BaudRate = 9600;
-
serialPort2.DataBits = 8;
-
-
-
}
-
-
//
-
private void button1_Click(object sender, EventArgs e)
-
{
-
-
}
-
-
-
//
-
private void button2_Click(object sender, EventArgs e)
-
{
-
-
if (!serialPort1.IsOpen) { serialPort1.Open(); }
-
-
_devam1 = true;
-
-
(new Thread(new ThreadStart(this.Read1))).Start();
-
-
-
-
if (!serialPort2.IsOpen) { serialPort2.Open(); }
-
-
_devam2 = true;
-
-
(new Thread(new ThreadStart(this.Read2))).Start();
-
-
}
-
-
-
//
-
public void Read1()
-
{
-
while (_devam1)
-
{
-
try
-
{
-
string message1 = serialPort1.ReadExisting();
-
if (_devam1) { this.richTextBox1.Text += message1; }
-
}
-
catch (TimeoutException) { }
-
}
-
}
-
-
-
//
-
public void Read2()
-
{
-
while (_devam2)
-
{
-
try
-
{
-
string message2 = serialPort2.ReadExisting();
-
if (_devam2) { this.richTextBox2.Text += message2;}
-
}
-
catch (TimeoutException) { }
-
}
-
}
-
-
private void button3_Click(object sender, EventArgs e)
-
{
-
if(durum){
-
_devam1 = true;
-
_devam2 = true;
-
}
-
-
if(!durum){
-
_devam1 = false;
-
_devam2 = false;
-
}
-
-
durum = !durum;
-
}
-
}
-
-
-
-
-
-
}
-
-
Eee, seri porttaki bilgiler siz almayınca da duruyor. Sonraki çağırışta tamponunda kalan her şeyi veriyor.
Yöntem 1: serialport nesnesini close metodunu çağırın.
Yöntem 2: serialport nesnesinin DiscardInBuffer metodunu çağırın.
-
System.thread.threading.sleep(sure ms) kullanarak threadi uyku moduna alabilirsin
-
Thread'i iptal etmek için cancellationtoken var hocam onada bakabilirsin.
Ayrıca bu tür Thread işlemlerini .Net 4.5 ile gelen async keywordu ile daha kolay yapabilirsin.
-
Yapacağın işi ayrı bi class olarak yapmanı, serial portu form yerine o classın içinde create etmeni tavsiye ederim.
O şekilde daha kolay debug edersin
-
new Thread (...
diyerek zaten yeni bir thread oluşturuyorsun.. yerinde olsam bir dizi ya da listede tüm threadleri tutarım..
sonra hangi threadi durduracaksam ya da bekleteceksem dizi/listeden çağırırım şöyle..
List<Thread> threadList = new List<Thread<();
...
threadList.Add(new Thread(new ThreadStart(this.Read1)));
threadList[0].Start();
threadList.Add(new Thread(new ThreadStart(this.Read2)));
threadList[1].Start();
ilk threadin işlemini iptal etmek için ise
threadList[0].Abort(); diyebilirsin
ya da bir şeyi bekleyecekse
Join kullanabilirsin..
Sleep metodunu kullanmak mantıklı değildir genel olarak.