PDA

View Full Version : خروج و داخل شدن در حلقه انتظار



saed2006
یک شنبه 26 اردیبهشت 1389, 08:13 صبح
یک حلقه انتظار دارم
میخوام وقتی یک کلید از روی فرم زده شد برنامه از حلقه خارج بشه

exlord
یک شنبه 26 اردیبهشت 1389, 08:33 صبح
یه flag بزار و تو حلقه چک کن اگه باتن کلیک شده break کن.......

saed2006
یک شنبه 26 اردیبهشت 1389, 08:45 صبح
وقتی حلقه در حال اجراست زدن کلید بی فایده هست مقدار فلگ تغییر نمیکند چون روند کنترل برنامه در اختیار حلقه بی نهایت قرار گرفته است

exlord
یک شنبه 26 اردیبهشت 1389, 08:48 صبح
وقتی حلقه در حال اجراست زدن کلید بی فایده هست مقدار فلگ تغییر نمیکند چون روند کنترل برنامه در اختیار حلقه بی نهایت قرار گرفته است
حلقه رو توی یه Thread یا background worker بزار........

saed2006
دوشنبه 27 اردیبهشت 1389, 09:14 صبح
وقتی حلقه رو توی یک ترد جدا میزارم تعداد زیادی خطای متنوع میگیرم
چون داخل حلقه بعضی از کار ها رو با استفاده از یه کامپونت انجام میدم اون کامپونت خطا میده
stack empty
stack owerflow
و کلی خطای ریز و درشت
این حلقه تغیراتی روی فرم ایجاد میکنه
راه دیگه ای به ذهن میرسه؟
اساتید لطفا کمک

saed2006
دوشنبه 27 اردیبهشت 1389, 11:10 صبح
اقا نیاز فوری دارم
یکی نیست کمک کنه

saed2006
دوشنبه 27 اردیبهشت 1389, 11:45 صبح
for (int i = 0; i < length; i++)
{
while (true)
{

}
}
فرض کنید تابع در حلقه while گیر کرده
کاربر باید بتونه با تغیر مقدار یک فلگ از این انتظار خارج بشه
مولتی ترد رو نمیتونم استفاده کنم چون توی حلقه ها از کامپونت استفاده کردم و اون کامپونت اجازه مولتی ترد نمیده

Hossein Bazyan
دوشنبه 27 اردیبهشت 1389, 11:50 صبح
وقتی حلقه در حال اجراست زدن کلید بی فایده هست مقدار فلگ تغییر نمیکند چون روند کنترل برنامه در اختیار حلقه بی نهایت قرار گرفته است

سلام
یا تو حلقه بعد از چند بار خواندن یه بار DoEvent رو اجرا کن مانند

if (rCount % 5 == 0) my.Application.DoEvents();
یا همونی که دوستمون exlord اشاره کردند رو ااستفاده کن

alireza_s_84
دوشنبه 27 اردیبهشت 1389, 11:58 صبح
یک حلقه انتظار دارم
میخوام وقتی یک کلید از روی فرم زده شد برنامه از حلقه خارج بشه

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

bool InLoop = true;
Thread LoopThread;
delegate void delUpdate();
LoopThread = new Thread(new ThreadStart(DoLoop));
private void DoLoop()
{
while (InLoop)
{
this.Invoke(new delUpdate(UpdateControls));
}
}
private void UpdateControls()
{

}


البته اساس کار اینطوریه امتحان کن ایرادی بود با پیام خطا مطرح کن در خدمت هستیم.
موفق باشی

saed2006
دوشنبه 27 اردیبهشت 1389, 12:17 عصر
ترد جدا گانه یا backgroundworker خطا میده

exlord
دوشنبه 27 اردیبهشت 1389, 14:34 عصر
ترد جدا گانه یا backgroundworker خطا میده
چه خطایی ؟؟؟؟؟ بعدشم همونی که alireza_s_84 گفت .......

mohsensaghafi
دوشنبه 27 اردیبهشت 1389, 20:55 عصر
سلام دوست عزیز.
فکر می کنم که برنامه رو باید منطقش رو عوض کنید. خیلی راه دیگه هست که این کار رو انجام بدید بدون حلقه بی نهایت. این حلقه Busy Waiting داره که برنامه نویسی جالبی نسیت. شما می تونی از سمافور ها مانیتور ها یا خواص مختلف ترد ها استفاده کنی.
یا علی!