PDA

View Full Version : سوال: ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی



babak1
یک شنبه 17 بهمن 1389, 08:58 صبح
سلام :
"ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی
برنامه تمامی message های درون message queue فعلی (از قبیل رخدادها و ...) را پردازش میکند."

میشه بیشتر توضیح بدید. به نظر میرسه که اینطوری حلقه طولانی تر میشه ؟؟ دقیقا Doevent() به درد چی می خوره ؟


application.DoEvent();

quantomquery
یک شنبه 17 بهمن 1389, 10:04 صبح
سلام :
"ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی
برنامه تمامی message های درون message queue فعلی (از قبیل رخدادها و ...) را پردازش میکند."

میشه بیشتر توضیح بدید. به نظر میرسه که اینطوری حلقه طولانی تر میشه ؟؟ دقیقا Doevent() به درد چی می خوره ؟


application.DoEvent();

ببینید
اگه شما بخواهید توی یک حلقه از 1 تا 1000000000 رو توی یک لیست بریزید
حلقه وقتی از 1 گذشت و به 2 رسید دستور نوشتن 1 رو تو لیست بوکس میده اما چون سرعت سی پی یو خیلی بالاست اینا میرن تو صف بعد که برنامه وقتی حلقه رو تموم کرد اینا رو اجرا کنه مثلا وقتی بخواهیم فرم رو حرکت بدیم میره تو صف بنویسه . سیستم عامل هم چون می بینه عمل تکون دادن فرم ارجع هست فرم رو نات رسپوندینگ میکنه ولی برنامه اون پشت داره کارشو انجام می ده و برای همینه که ما فکر میکنیم برنامه قفل کرده هست
حالا اگه تو حلقه بنویسی


application.DoEvent();
application.invalidate();

(شاید غلط املایی داشته باشه)

هروقت به این کد ها برسه اول اون کارایی که تو صف بوده (یعنی نوشتن تو لیست بوکس یا اینکه مثلا فرم را با ماوس تکون بدی)
رو انجام میده بعد میره ادامه حلقه رو انجام می ده و چون تو حلقه هست هر بار اجرا می شه و ما فکر می کنیم که برنامه راحت داره کار می کنیم
توسرعت برنامه تاثیر مثبت نداره

محسن شامحمدی
یک شنبه 17 بهمن 1389, 12:10 عصر
میشه بیشتر توضیح بدید. به نظر میرسه که اینطوری حلقه طولانی تر میشه ؟؟
دقیقا همینطوره
چون در هربار اجرای حلقه یک دفعه هم به کارهای ویندوز رسیدگی می شه.

دقیقا Doevent() به درد چی می خوره ؟
به درد اینکه توی حلقه ها استفاده بشه تا فرم برنامه فریز نشه.

البته استفاده از Thread از دستور Doevents ارجح تره.

babak1
دوشنبه 18 بهمن 1389, 14:04 عصر
quantomquert عزیز این بخش رو اصلا متوجه نشدم !!


مثلا وقتی بخواهیم فرم رو حرکت بدیم میره تو صف بنویسه . سیستم عامل هم چون می بینه عمل تکون دادن فرم ارجع هست فرم رو نات رسپوندینگ میکنه ولی برنامه اون پشت داره کارشو انجام می ده و برای همینه که ما فکر میکنیم برنامه قفل کرده هست

برداشت من این هستش :
ما برنامه رو با یک حلقه 1000000000 اجرا می کنیم. بعد فرم رو هم با موس حرکت می دهیم.خوب در این قسمت شما می گید که این عمل نیز در صف قرار می گیره و از اولویت بیشتری نسبت به بقیه دستورات برخورداره و باید زودتر اجرا بشه. حالا سوال من اینجاست که چرا فرم freeze میشه ؟؟ مگه اولویت نداره و نباید اجرا بشه ؟؟

babak1
دوشنبه 18 بهمن 1389, 14:13 عصر
در ضمن application.Invalidate رو پیدا نکردم . در ObjectBrowser جستجو کردم و این رو پیدا کردم . Control.Invalidate

با تشکر فراوان.

silverfox
دوشنبه 18 بهمن 1389, 15:30 عصر
من با DoEvents مشکلم حل نشد یه بار که به این مشکل خورده بودم ... از ترد ها استفاده کن background worker خیلی کار رو ساده کرده...