PDA

View Full Version : خواندن از پورت سريال بوسيله thread. (مشكل: CPU Usage = 99%)



plato
شنبه 24 بهمن 1388, 21:24 عصر
من يه تكه كد دارم كه قراره يه سري ديتا از پورت سريال بخونه و تحليل كنه و نمايش بده. مشكلي كه دارم اينه كه بعد از شروع برنامه CPU Usage بعد از چند ثانيه به 99% ميرسه. كد رو گذاشتم. لطفاً راهنمايي كنيد.

Himalaya
یک شنبه 25 بهمن 1388, 00:28 صبح
public void Read()
{
while (bContinue)
{
...
}

}
اومدید یه متد به اسم read تعریف کردید و تو کلیک دکمه استارت
bContinue = true رو نوشتید و بعد تابع read رو فراخونی کردید... پس تا وقتی که دکمه stop زده نشده برنامه تو این حلقه میمونه و حتی اگه داده ای از پورت سریال نرسه بازهم مجبوره اونو چک کنه...
به جای این کار پیشنهاد میکنم از ایونت DataReceived پورت سریال استفاده کنید
اين ایونت فقط زمانی که داده ای از پورت سریال برسه عمل میکنه و برنامه هم درگیر یه حلقه بینهایت که پدر cpu رو دربیاره نمیشه

plato
یک شنبه 25 بهمن 1388, 08:53 صبح
public void Read()
{
while (bContinue)
{
...
}

}
اومدید یه متد به اسم read تعریف کردید و تو کلیک دکمه استارت
bContinue = true رو نوشتید و بعد تابع read رو فراخونی کردید... پس تا وقتی که دکمه stop زده نشده برنامه تو این حلقه میمونه و حتی اگه داده ای از پورت سریال نرسه بازهم مجبوره اونو چک کنه...
به جای این کار پیشنهاد میکنم از ایونت DataReceived پورت سریال استفاده کنید
این ایونت فقط زمانی که داده ای از پورت سریال برسه عمل میکنه و برنامه هم درگیر یه حلقه بینهایت که پدر cpu رو دربیاره نمیشه


از راهننماییت ممنونم. من از DataReceived کردم. یعنی اون کاری که تو thread میکردم گذاشتم تو DataReceived . ولی مشکل اینجاست که حالا همزمان نمیتونم داده ی ورودی رو رو فرم نمایش بدم.

Himalaya
یک شنبه 25 بهمن 1388, 09:52 صبح
ولی مشکل اینجاست که حالا همزمان نمیتونم داده ی ورودی رو رو فرم نمایش بدم
و اگه منظورت از همزمان نمایش دادن اینه که دادهای که میرسه رو ،رو فرم مثلا تو لیبل نمایش بدی


delegatevoidmyDelegate(string message);
public Form1()
{
InitializeComponent();
}





privatevoid serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string data = "";
data = serialPort1.ReadExisting().Trim();
DoSomeThing(data);
}




void DoSomeThing(string message)
{
if (labelX2.InvokeRequired)
labelX2.Invoke(newmyDelegate(DoSomeThing), newobject[] { message });
else
labelX2.Text = message;
}

از یه همچین کدی واسه نمایش داده های رسیده از پورت سریال تو لیبل استفاده میشه

plato
یک شنبه 25 بهمن 1388, 14:11 عصر
if (labelX2.InvokeRequired)
labelX2.Invoke(newmyDelegate(DoSomeThing), newobject[] { message });


از یه همچین کدی واسه نمایش داده های رسیده از پورت سریال تو لیبل استفاده میشه

بجای این شرطی که شما نوشتید میشه کد زیر رو بزارم تو dataRecieve() و داخل Delegate فقط مقدار دهی انجام بشه


txtX.BeginInvoke(new SetTextCallback(ImportProcess), new object[] { strArrImport });


و داخل

MehdiLiver
یک شنبه 25 بهمن 1388, 14:28 عصر
سلام من کل زندگیم رو روی سریال و کار کردن با اون گذاشتم دلیل اینکه شما cpu Using بالا میره اینه که Baud Rate شما بالا هست برای رفع این مشکل باید TextBox که داده هاتون از سریال توش میاد رو هی Clear کنید مثلا بالای 50 خط شد 30 تای اولش رو پاک کنه :چشمک: منم این مشکل رو داشتم به همین راحتی قابل رفع میشه، راستی Input Buffer Size CommControler هم ببر بالا مثلا رو 30k که بافر CommControler خالی شه