نمایش نتایج 1 تا 6 از 6

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

  1. #1

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

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

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

     application.DoEvent();

  2. #2

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

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

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

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

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

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

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

  3. #3

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

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

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

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

  4. #4

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

    quantomquert عزیز این بخش رو اصلا متوجه نشدم !!

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

  5. #5

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

    در ضمن application.Invalidate رو پیدا نکردم . در ObjectBrowser جستجو کردم و این رو پیدا کردم . Control.Invalidate

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

  6. #6
    کاربر دائمی آواتار silverfox
    تاریخ عضویت
    دی 1386
    محل زندگی
    تهران
    سن
    32
    پست
    559

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

    من با DoEvents مشکلم حل نشد یه بار که به این مشکل خورده بودم ... از ترد ها استفاده کن background worker خیلی کار رو ساده کرده...

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •