PDA

View Full Version : سوال: تکرار دستورات بدون حلقه و تایمر



NewFoxStudent
سه شنبه 29 بهمن 1387, 10:10 صبح
من توی پروژم نیاز دارم تا قسمتی از کد با فرمان کاربر اجرا بشه و این دستورات تکرار بشه تا زمانی که کاربر فرمان توقف رو صادر کنه اما اگه از تایمر یا حلقه استفاده کنم بعد از یه مدت برنامه قفل میکنه .
میدونم که باید این دستورات رو توسط یه Proc جداگانه اجرا کنم اما راهش رو بلد نیستم اگه ممکنه راهنماییم کنید.

کسی نمیخواد جواب بده

notelo
سه شنبه 29 بهمن 1387, 10:39 صبح
سلام

اگه بگی که چه دستوراتی رو مخوای مداوم تا زمان دستور کاربر اجرا کنه شاید بتونم بیشتر راهنمایی کنم.

البته اگه بتونم راهنمایی کنم :لبخند:

mehdi.mousavi
سه شنبه 29 بهمن 1387, 11:14 صبح
من توی پروژم نیاز دارم تا قسمتی از کد با فرمان کاربر اجرا بشه و این دستورات تکرار بشه تا زمانی که کاربر فرمان توقف رو صادر کنه اما اگه از تایمر یا حلقه استفاده کنم بعد از یه مدت برنامه قفل میکنه. میدونم که باید این دستورات رو توسط یه Proc جداگانه اجرا کنم اما راهش رو بلد نیستم اگه ممکنه راهنماییم کنید.

سلام.
متوجه نمیشم منظورتون از قفل کردن چیه. چون حتی با تایمر هم نباید مشکلی داشته باشید، مگر اینکه برنامه رو به حالت dead-lock برسونید. در هر حال، شما همواره می تونید از Worker Thread ها برای انجام کارهای زمانبر استفاده کنید. به این ترتیب که کار زمانبر رو در Thread جداگانه ای انجام می دید، و سپس با Notification هایی Thread اصلی رو از روند کار مطلع می کنید. برای شروع می تونید از BackgroundWorker استفاده کنید.

پاورقی: ابتدا در مورد Thread ها و Synchronization Object ها مطالعه کنید، بعد اقدام به اجرای سیستمهای Multi-Threaded کنید. در غیر اینصورت، وضعیت رو فقط نابسامانتر می کنید!

NewFoxStudent
سه شنبه 29 بهمن 1387, 13:17 عصر
اگه لطف کنید و در مورد thread ها توضیح بیشتری بدید ممنون میشم
من دقیقا میخوام روش کار با thread ها رو بدونم
جستجو هم کردم اما چیزی گیرم نیومد یا شاید من متوجه نشدم
من میخوام بدون استفاده از تایمر دائما یک ارتباط رو چک کنم و یه سری اطلاعات رو از این ارتباط دریافت کنم و میخوام حین انجام این کار کاربر بتونه کارای دیگه ای رو هم انجام بده
میدونم که این کار باید با یک thread دیگه انجام بشه ولی نمیدونم چطوری

kiosksoft
سه شنبه 29 بهمن 1387, 13:49 عصر
دوست عزیز

این کتاب خیلی عالی توضیح داده , همه چی رو در مورد ترد گفته , کمکتون میکنه .

تو سایت هم در موردش بحث شده قبلا .

molana alavi
چهارشنبه 30 بهمن 1387, 01:22 صبح
شاید مشکل قفل شدن برنامت با دستور زیر حل بشه

Application.DoEvents();

علیرضا مداح
چهارشنبه 30 بهمن 1387, 11:00 صبح
سلام دوست عزیز،


Application.DoEvents();

پیشنهاد میکنم پیش از بهره گیری از این متد، مطلب زیر را حتما" مطالعه نمایید:
Keeping your UI Responsive and the Dangers of Application.DoEvents (http://blogs.msdn.com/jfoscoding/archive/2005/08/06/448560.aspx)

NewFoxStudent
دوشنبه 11 خرداد 1388, 21:34 عصر
متاسفانه من هنوز به نتیجه نرسیدم
سوالم رو دوباره مطرح میکنم

من میخوام دستگاه حضور غیاب رو مونیتور کنم یعنی هر کارتی که زده میشه همون لحظه اطلاعاتش رو از دستگاه بگیرم و توی برنامه نمایش بدم
برای این کار باید به صورت مداوم اطلاعات آخرین رکورد رو از دستگاه دریافت کنم و با آخرین رکوردی که توی فرم نمایش دادم مقایسه کنم و اگه متفاوت بود اون رو به عنوان آخرین رکورد نمایش بدم
در حین انجام این کار کاربر باید بتونه کارهای دیگه ای رو هم انجام بده
من عمل مونیتور رو توی یک Thread جداگانه انجام میدم ولی مشکل اینجاست که این Thread فقط یک بار کار میکنه و از بین میره.
چطور میتونم کاری کنم که این Thread توی یه حلقه بینهایت بیفته و مدام اجرا بشه به صورتی که برنامه بتونه بقیه کارهاش رو به صورت عادی انجام بده

NewFoxStudent
سه شنبه 12 خرداد 1388, 09:40 صبح
این پست برای بالا اومدن تاپیک هیچ ارزش قانونی دیگه ای نداره

bahar_engineer
سه شنبه 12 خرداد 1388, 10:34 صبح
سلام نمی تونین اونو توی یه switch اجرا کنین ؟؟؟ هر وقت کاربر دستور توقف صادر کرد مثلاً سوییچ کنین به توقف حلقه تون...
اما در حالت عادی مثلاً متغیر سوییچ true باشه وقتی کاربر دستور توقف داد false بشه و دستورات رو توی case بذارین!؟؟؟

شرمنده اگه ربطی نداره:خجالت:

NewFoxStudent
سه شنبه 12 خرداد 1388, 10:58 صبح
من میخوام دستوراتم بطور مداوم اجرا بشه با سوئیچ فقط یک بار اجرا میشه
اگه از حلقه بینهایت هم استفاده کنم خوب کنترل برنامه توی حلقه میفته و کاربر نمیتونه کاری انجام بده
وقتی حلقه رو توی یک Thread دیگه اجرا میکنم هم برنامه به کار خودش ادامه نمیده و Notrespons میشه

NewFoxStudent
سه شنبه 12 خرداد 1388, 14:46 عصر
این پست برای یالا اومدن تاپیک
چون نمیخوام برای این سوالم یه تاپیک دیگه بسازم

bahar_engineer
سه شنبه 12 خرداد 1388, 16:00 عصر
به نظر من شما بررسی کنید که چرا با تایمر برنامه قفل می کنه ...

NewFoxStudent
چهارشنبه 13 خرداد 1388, 09:10 صبح
مشکل از تایمر نیست
مسئله من اینه که اگه از تایمر استفاده کنم باید در هر بار اجرا یک دستور به دستگاه ارسال کنم و این مسئله باعث میشه دستگاه بعد از حدود 20 بار دریافت دستور دیگه جواب دستورات رو نده و همین باعث قفل شدن برنامه میشه
چون توی تایمر باید مقادیر بازگشتی از دستگاه خونده بشه و وقتی توی این مقادیر مشکلی پیش میاد تایمر نمیتونه کارش رو به درستی انجام بده

NewFoxStudent
چهارشنبه 13 خرداد 1388, 13:45 عصر
این پست برای بالا اومدن تاپیک ارسال میشه

esmaeily-hosein
چهارشنبه 13 خرداد 1388, 17:16 عصر
public Form1()
{
InitializeComponent();

ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessThread), new ManualResetEvent(false));

}

private void ProcessThread(object state)
{
ManualResetEvent mre = state as ManualResetEvent;
while(true)
{
mre.WaitOne(1000, false);//delay or wait for a signal
//do Something
}
}


این ساده ترین روش ساخت یک timer با thread ها میباشد . در ضمن ساخت timer بدون استفاده از حلقه مثله آب بدون اکسیژن میمونه .

prankster
چهارشنبه 13 خرداد 1388, 22:49 عصر
این ساده ترین روش ساخت یک timer با thread ها میباشد

آیا دلیل خاصی دارد که برای handle کردن تنها یک thread از ThreadPool استفاده کرده اید؟ مزیتی بر ایجاد Thread جداگانه و متوقف کردن آن در یک حلقه دارد؟

NewFoxStudent
پنج شنبه 14 خرداد 1388, 13:11 عصر
از دوستان خواهش میکنم اگه منبعی یا سایتی برای این مسئله (ThreadPool) دارن معرفی کنن تا من هم استفاده کنم

esmaeily-hosein
پنج شنبه 14 خرداد 1388, 14:50 عصر
استفاده از thread pool و thread هر دو درسته .
خود thread pool مدیریتشو framework انجام میده و کار من هم تا آخر مانند یک timer بایستی انجام میشد . در ضمن در نسخه .net 1.1 دستور thread پارامتر نداشت یعنی نمیتونستی بهش سیگنال بفرستی که کارشو دیگه ادامه نده .
کتاب deitel بخون قسمت threading اون فوق العاده است .

NewFoxStudent
پنج شنبه 14 خرداد 1388, 15:45 عصر
من یه سوال دیگه هم دارم
روش متوقف کردن این حلقه بدون از بین بردن Thread چیه

prankster
جمعه 15 خرداد 1388, 01:42 صبح
خود thread pool مدیریتشو framework انجام میده
بله همینطوره، برایم سوال بود چون معمولا در برنامه های UI با یکی دو thread از threadpool استفاده نمی کنم. استفاده از Thread علاوه بر ایجاد overhead برای برنامه نیاز به مدیریت درست و بهینه برنامه نویس و دقت در پایان دادن به آن دارد، اما یک نکته در مورد thread وجود دارد و آن اینکه کنترل Thread و سطح priority آن دست برنامه نویس است در صورتی که Threadpool به صورت اتوماتیک توسط framework کنترل می شود، حداقل در تئوری Thread های ایجاد شده در Threadpool می توانند کند تر نسبت به Thread معمولی اجرا شوند و یا در صورتی که CPU مشغول باشد اصلا مجالی برای اجرا پیدا نکنند...اگر تجربه ای در این مورد دارید ممنون می شوم بیشتر بحث کنیم



از دوستان خواهش میکنم اگه منبعی یا سایتی برای این مسئله (ThreadPool) دارن معرفی کنن تا من هم استفاده کنم

threadpool در برنامه هایی که تعداد thread های ایجاد شده زیاد است و ایجاد thread های زیاد علاوه بر سخت بودن کنترل مدیریت بار زیادی را به CPU وارد می کنند کاربرد دارد. این مساله عمدتا در برنامه های سمت سرور رخ می دهد، برای مثال برنامه یک web server مثل IIS با توجه به اینکه هر user تعداد زیادی connection با سرور برقرار می کند و هر connection باید در یک thread جداگانه پاسخ داده شود بدون استفاده از threadpool یا API مشابه برای کنترل و اولویت دادن به thread ها غیر ممکن است
در برنامه نویسی UI معمولا Thread به تنهایی پاسخگو است، در برنامه های تحت شبکه، برنامه های WF که چندین کاربر درگیر هستند و یا مثلا در WCF و WebService هایی که یک کاربر چندین کار را همزمان انجام می دهد استفاده از threadpool اجتناب ناپذیر است


روش متوقف کردن این حلقه بدون از بین بردن Thread چیه
مثل متوقف کردن تمامی حلقه ها: شرط حلقه!
شرط حلقه را می توانید از داخل Thread اصلی تغییر دهید. از آنجایی که شرط حلقه یک متغیر Boolean است و thread-safe می باشد به شرطی که در هیچ یک از thread ها این متغیر قفل نشده باشد به اشتراک گذاشتن آن بین thread ها مشکلی ایجاد نمی کند.
اگر دوست دارید در مورد Thread variables بیشتر مطالعه کنید

esmaeily-hosein
یک شنبه 17 خرداد 1388, 14:42 عصر
روش متوقف کردن این حلقه بدون از بین بردن Thread چیه

در اصل بایستی سوالت اینگونه مطرح میکردی نحوه برقرار کردن ارتباط بین چند thread چگونه است .
که حالا این راههای مختلفی داره و یکی از اونها Thread variables است .
اگر خواستی بگو توضیح بدم .