ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی
سلام :
"ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی
برنامه تمامی message های درون message queue فعلی (از قبیل رخدادها و ...) را پردازش میکند."
میشه بیشتر توضیح بدید. به نظر میرسه که اینطوری حلقه طولانی تر میشه ؟؟ دقیقا Doevent() به درد چی می خوره ؟
application.DoEvent();
نقل قول: ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی
نقل قول:
نوشته شده توسط
babak1
سلام :
"ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی
برنامه تمامی message های درون message queue فعلی (از قبیل رخدادها و ...) را پردازش میکند."
میشه بیشتر توضیح بدید. به نظر میرسه که اینطوری حلقه طولانی تر میشه ؟؟ دقیقا Doevent() به درد چی می خوره ؟
application.DoEvent();
ببینید
اگه شما بخواهید توی یک حلقه از 1 تا 1000000000 رو توی یک لیست بریزید
حلقه وقتی از 1 گذشت و به 2 رسید دستور نوشتن 1 رو تو لیست بوکس میده اما چون سرعت سی پی یو خیلی بالاست اینا میرن تو صف بعد که برنامه وقتی حلقه رو تموم کرد اینا رو اجرا کنه مثلا وقتی بخواهیم فرم رو حرکت بدیم میره تو صف بنویسه . سیستم عامل هم چون می بینه عمل تکون دادن فرم ارجع هست فرم رو نات رسپوندینگ میکنه ولی برنامه اون پشت داره کارشو انجام می ده و برای همینه که ما فکر میکنیم برنامه قفل کرده هست
حالا اگه تو حلقه بنویسی
application.DoEvent();
application.invalidate();
(شاید غلط املایی داشته باشه)
هروقت به این کد ها برسه اول اون کارایی که تو صف بوده (یعنی نوشتن تو لیست بوکس یا اینکه مثلا فرم را با ماوس تکون بدی)
رو انجام میده بعد میره ادامه حلقه رو انجام می ده و چون تو حلقه هست هر بار اجرا می شه و ما فکر می کنیم که برنامه راحت داره کار می کنیم
توسرعت برنامه تاثیر مثبت نداره
نقل قول: ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی
نقل قول:
میشه بیشتر توضیح بدید. به نظر میرسه که اینطوری حلقه طولانی تر میشه ؟؟
دقیقا همینطوره
چون در هربار اجرای حلقه یک دفعه هم به کارهای ویندوز رسیدگی می شه.
دقیقا Doevent() به درد چی می خوره ؟
به درد اینکه توی حلقه ها استفاده بشه تا فرم برنامه فریز نشه.
البته استفاده از Thread از دستور Doevents ارجح تره.
نقل قول: ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی
quantomquert عزیز این بخش رو اصلا متوجه نشدم !!
نقل قول:
مثلا وقتی بخواهیم فرم رو حرکت بدیم میره تو صف بنویسه . سیستم عامل هم چون می بینه عمل تکون دادن فرم ارجع هست فرم رو نات رسپوندینگ میکنه ولی برنامه اون پشت داره کارشو انجام می ده و برای همینه که ما فکر میکنیم برنامه قفل کرده هست
برداشت من این هستش :
ما برنامه رو با یک حلقه 1000000000 اجرا می کنیم. بعد فرم رو هم با موس حرکت می دهیم.خوب در این قسمت شما می گید که این عمل نیز در صف قرار می گیره و از اولویت بیشتری نسبت به بقیه دستورات برخورداره و باید زودتر اجرا بشه. حالا سوال من اینجاست که چرا فرم freeze میشه ؟؟ مگه اولویت نداره و نباید اجرا بشه ؟؟
نقل قول: ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی
در ضمن application.Invalidate رو پیدا نکردم . در ObjectBrowser جستجو کردم و این رو پیدا کردم . Control.Invalidate
با تشکر فراوان.
نقل قول: ساده ترین راه برای جلوگیری از Not Respond شدن برنامه در حلقه های طولانی
من با DoEvents مشکلم حل نشد یه بار که به این مشکل خورده بودم ... از ترد ها استفاده کن background worker خیلی کار رو ساده کرده...