PDA

View Full Version : سوال: سریال پورت و Thread



ArtStyle
چهارشنبه 22 بهمن 1393, 14:02 عصر
با سلام
وقت همگی بخیر

یه سوالی راجع به پورت سریال و Thread برام پیش اومده ممنون میشم کسی راهنمایی کنه

من میخوام در برنامم موقعی که از سریال پورت اطلاعاتی میاد برنامه اولویت خودشو بذاره رو مقادیر گرفته شده از Data_Receive یعنی تمام کارای دیگه متوقف شه

در واقع دو سریال پورت در حال استفادس حال اگر 50 میلی ثانیه هم تاخیر داشته باشم مقادیر دیگه به دردم نمیخوره ( اگر در کدهام از (Thread.Sleep(50 استفاده کنم )

در واقع میخوام مثل CodeVision مقادیر رو به صورت آنی دریافت کنم ممنون میشم کسی راهنمایی کنه

plus
چهارشنبه 22 بهمن 1393, 16:06 عصر
کل عملیات مربوط به کار با پورت مورد نظر رو در یک Thread مجزا انجام بدین. لزومی نداره کار های دیگه متوقف بشه مگه اینکه اون کارها درصد قابل توجهی از CPU رو بگیره.

ArtStyle
پنج شنبه 23 بهمن 1393, 12:38 عصر
دوست عزیز ممنون میشم اگه یه سمپل کد برام بذاری چون مشکلم اینه که نمیتونم یک دلیگیت به ThreadStart بفرستم یعنی اجازه نمیده تابع Data_Receive رو توش قرار بدم چرا که این تابع دارای پارامتره و Threadstart حتما بدون پارامتر میخواد

SabaSabouhi
پنج شنبه 23 بهمن 1393, 13:57 عصر
سلام
دوست من، Thread می‌تونه پارامتر داشته باشه.
http://stackoverflow.com/questions/1195896/threadstart-with-parameters

و بر خلاف نظر دوستمون plus به نظر من حتماً از sleep استفاده کن تا عملکرد
عادی نرم‌افزار دچار مشکل نشه.

صبا صبوحی

ArtStyle
پنج شنبه 23 بهمن 1393, 14:35 عصر
ممنون از راهنماییتون منم همین کارو قبلا انجام دادم ولی مشکلم اینه که وقتی اسلیپ میزنم باید زمان تعیین شده باشه ولی من میخوام با این اسلیپ برنامه بره سراغ Data_Receive و وقتی کارش اونجا تموم شد بلافاصله برگرده به Thread اصلی .

آیا راهی هست که بشه Thread ای که اسلیپ کردم رو بش بگم بعد از اتمام Data_Receive دوباره به کارش ادامه بده قبل از این که تایم اسلیپ تموم شه ؟ چون زمان خیلی مهمه اگه 20 میلی ثانیه بیشتر شه امکان داره مقادیرم دچار مشکل شه

plus
پنج شنبه 23 بهمن 1393, 16:10 عصر
سلام
دوست من، Thread می‌تونه پارامتر داشته باشه.
http://stackoverflow.com/questions/1195896/threadstart-with-parameters

و بر خلاف نظر دوستمون plus به نظر من حتماً از sleep استفاده کن تا عملکرد
عادی نرم‌افزار دچار مشکل نشه.

صبا صبوحی
منظورتون رو متوجه نشدم. یعنی شما در UI Thread‌از Sleep استفاده میکنید؟ چه نکته ای در استفاده از Sleep هست؟ فراخوانی Sleep هیچ کاری جز متوقف کردن Thread جاری انجام نمیده، حالا شما اگه Thread دیگه ای نداشته باشین که براتون کار انجام بده Sleep‌ فقط باعث هنگ کردن UI میشه.

ممنون از راهنماییتون منم همین کارو قبلا انجام دادم ولی مشکلم اینه که وقتی اسلیپ میزنم باید زمان تعیین شده باشه ولی من میخوام با این اسلیپ برنامه بره سراغ Data_Receive و وقتی کارش اونجا تموم شد بلافاصله برگرده به Thread اصلی .

آیا راهی هست که بشه Thread ای که اسلیپ کردم رو بش بگم بعد از اتمام Data_Receive دوباره به کارش ادامه بده قبل از این که تایم اسلیپ تموم شه ؟ چون زمان خیلی مهمه اگه 20 میلی ثانیه بیشتر شه امکان داره مقادیرم دچار مشکل شه
شما تا وقتی دو Thread‌نداشته باشید که نمیتونید اون رو هم Sleep کنید و هم در اجرای متد Data_Receive داشته باشید. اگه شما Data_Receive‌ رو مثلا در Thread1 در حال اجرا داشته باشید، وقتی در UI Thread هستین با استفاده از متد Thread.Join میتونید Thread جاری رو تا اتمام Thread1 متوقف کنید.
برای استفاده از Parameter موقع ایجاد Thread میتونید به این روش عمل کنید:

class Data_ReceiveParams {
public int Parameter1 {
get;
set;
}
public int Parameter2 {
get;
set;
}
}
private void button1_Click_9(object sender, EventArgs e) {
var thredStart = new ParameterizedThreadStart(DoSomeOperation);
var dataReceiveParams = new Data_ReceiveParams();
dataReceiveParams.Parameter1 = 10;
dataReceiveParams.Parameter2 = 15;
Thread thread = new Thread(thredStart);
thread.Start(dataReceiveParams);
}
private void DoSomeOperation(object dataReceiveParams) {
Data_ReceiveParams dParams = (Data_ReceiveParams)dataReceiveParams;
Data_Receive(dParams.Parameter1, dParams.Parameter2);
this.BeginInvoke((MethodInvoker) delegate { this.NotifyOperationsDone()});
}
private void Data_Receive(int parameter1, int parameter2) {
// Do lengthy operation
}
private void NotifyOperationsDone() {
// Here we are in UI thread
MessageBox.Show("Done!");
}

SabaSabouhi
جمعه 24 بهمن 1393, 00:33 صبح
ممنون از راهنماییتون منم همین کارو قبلا انجام دادم ولی مشکلم اینه که وقتی اسلیپ میزنم باید زمان تعیین شده باشه ولی من میخوام با این اسلیپ برنامه بره سراغ Data_Receive و وقتی کارش اونجا تموم شد بلافاصله برگرده به Thread اصلی .

آیا راهی هست که بشه Thread ای که اسلیپ کردم رو بش بگم بعد از اتمام Data_Receive دوباره به کارش ادامه بده قبل از این که تایم اسلیپ تموم شه ؟ چون زمان خیلی مهمه اگه 20 میلی ثانیه بیشتر شه امکان داره مقادیرم دچار مشکل شه

سلام
آیا شما با EventWaitHandle آشنایی داری؟ اگه داری ازش استفاده کن.
فقط اگه آشنایی ندارین، اول خوب مطالعه کن چون این مبحث خیلی حرفه‌ای هست و اگه درست انجام ندی، کارت رو مشکل‌تر می‌کنه.

صبا صبوحی

SabaSabouhi
جمعه 24 بهمن 1393, 00:35 صبح
منظورتون رو متوجه نشدم. یعنی شما در UI Thread‌از Sleep استفاده میکنید؟ چه نکته ای در استفاده از Sleep هست؟ فراخوانی Sleep هیچ کاری جز متوقف کردن Thread جاری انجام نمیده، حالا شما اگه Thread دیگه ای نداشته باشین که براتون کار انجام بده Sleep‌ فقط باعث هنگ کردن UI میشه.

شما تا وقتی دو Thread‌نداشته باشید که نمیتونید اون رو هم Sleep کنید و هم در اجرای متد Data_Receive داشته باشید. اگه شما Data_Receive‌ رو مثلا در Thread1 در حال اجرا داشته باشید، وقتی در UI Thread هستین با استفاده از متد Thread.Join میتونید Thread جاری رو تا اتمام Thread1 متوقف کنید.


سلام
دوست عزیز، منظورم Sleep کردن UI نبود، بلکه منظورم اون Thread دوم بود که قراره از درگاه سریال بخونه.

صبا صبوحی