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

نام تاپیک: Application.ProcessMessages چیست و چرا نباید هرجایی از آن استفاده کرد ؟

  1. #1
    Super Moderator
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    WinNT
    پست
    5,936

    Application.ProcessMessages چیست و چرا نباید هرجایی از آن استفاده کرد ؟

    Application.ProcessMssages چیست ؟
    همونطور که میدونید اساس کار سیستم عامل ویندوز پیغام ها ( Messages ) هستند که توضیحات مربوطه در این مقاله نمیگنجه ، با صدا زدن متد ProcessMessages روند عادی اجرای کدهای برنامه فراخوان این متد معلق میشود و Main Thread برنامه ملزم به پردازش پیغام های موجود در صف برنامه میشود ، این روند پردازش پیغام ها تا خالی شدن کامل صف پیغام های مربوط به برنامه ( Main Thread ) ادامه پیدا میکند و پس از پردازش تمام پیغام های موجود در صف و انجام عملیات مربوط به اون ها برنامه به اجرای عادی کدهای قبلی خودش که اجرای اون ها با فراخوانی متد ProcessMessages معلق شده بود ادامه میده .

    چرا نباید هرجایی از آن استفاده کرد ؟
    با نوشتن کدی که بار پردازشی زیادی رو به برنامه تحمیل میکنه به دلیل Single Thread بودن برنامه های نوشته شده به صورت پیش فرض این کدهای زمان بر در نخ اصلی برنامه که وظیفه به روز رسانی رابط کاربری رو بر عهده داره اجرا میشن و چون این Thread مشغول اجرای این کدهای زمان بر هست نمیتونه به پیغام های به روز رسانی رابط کاربری رسیدگی کنه و عملا UI برنامه فریز میشه و برنامه موقتا تا پایان عملیات پردازش از دسترس خارج میشه ؛ مثلا کد زیر :

    var
    cycle: integer;
    begin
    inc(worklevel);
    for cycle := 1 to 5 do
    begin
    Memo1.Lines.Add('- Work ' + IntToStr(worklevel) + ', Cycle ' +
    IntToStr(cycle));
    sleep(1000);
    // some other work
    end;
    Memo1.Lines.Add('Work ' + IntToStr(worklevel) + ' ended.');
    dec(worklevel);
    end;


    * متغییر worklevel رو در بخش private فرم برنامه از نوع Integer تعریف کنید .

    خوب با نوشتن کد بالا داخل یک دکمه و زدن دکمه حلقه شروع به چاپ میکنه و رابط کاربری برنامه موقتا از دسترس خارج میشه ، ولی با این حال با کلیک دوباره روی دکمه برنامه از خودش عکس العملی نشون نمیده ولی سیستم عامل این کلیک رو در Message Queue برنامه ثبت میکنه تا برنامه در اولین فرصت بهش رسیدگی کنه ؛ یعنی شما اگر 3 بار روی دکمه کلیک کنید با اینکه رابطه کاربری برنامه غیر فعال هست ولی بعد از پایان هر دوره چاپ ( پایان حلقه ) به تعداد کلیک زده شده روی دکمه حلقه دوباره شروع به چاپ میکنه ، چون کلیک انجام شده روی دکمه به عنوان یک پیغام در Message Queue برنامه ثبت شده و تا زمانی که به این پیغام رسیدگی نشه از این صف حذف نمیشه .

    حالا میخوایم با استفاده از متد ProcessMessage از شئ Application برنامه رو مجبور کنیم در هر بار دور زدن حلقه پیغام های داخل صف برنامه رو پردازش کنه و به اونها رسیدگی کنه تا رابط کاربری برنامه که پیغام های به روز رسانیش تو همین صف درج میشه از کار نیافته :

    var
    cycle: integer;
    begin
    inc(worklevel);
    for cycle := 1 to 5 do
    begin
    Memo1.Lines.Add('- Work ' + IntToStr(worklevel) + ', Cycle ' +
    IntToStr(cycle));
    Application.ProcessMessages;
    sleep(1000);
    // or some other work
    end;
    Memo1.Lines.Add('Work ' + IntToStr(worklevel) + ' ended.');
    dec(worklevel);
    end;


    خوب ؛ دوستان تازه وارد با مواجه شدن با هر نوع پردازش سنگینی که UI رو تحت تائثیر قرار میده بدون در نظر گرفتن شرایط خیلی راحت متد ProcessMessages رو صدا میزنن و کلی هم کیف میکنن که همه چیز درست شد ؛ مثل کد بالا !

    خوب حالا که کد بالا رو داخل یک دکمه نوشتید برنامه رو اجرا کنید و روی دکمه چند بار کلیک کنید ( با فاصله های زمانی مختلف ) ، خوب ؟ با چه خروجی مواجه شدید ؟!

    با اجرای کد بالا ترتیب اجرای کدها به صورت کامل به هم میریزه ، چون شما با صدا زدن متد ProcessMessages ماهیت صف رو زیر سوال بردید که البته با صدا زدن متد ProcessMessages این امری طبیعی هست ، مثل این میمونه که در یک نانوایی صف طوری باشه که نانوا به جای اینکه هر کی زودتر اومده تو صف بهش نان زودتر بده ، به هر کی که وارد صف میشه و داد میزنه من نان میخوام نون بده ، حالا 10 نفر هم جلوی اون طرفی که داد زده بودن ولی نون به اونی که داد زده میرسه و بعد به افراد داخل صف !

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

    در آخر استفاده از این متد در پروژه های کوچک ممکنه کار راه انداز باشه ولی در کل اصلا پیشنهاد نمیشه ، برای اجرای کدهای زمانبر و سنگین بهترین گزینه تردها هستند .

    موفق باشید .

  2. #2
    کاربر دائمی
    تاریخ عضویت
    شهریور 1387
    محل زندگی
    کاشان
    پست
    809

    نقل قول: Application.ProcessMessages چیست و چرا نباید هرجایی از آن استفاده کرد ؟

    تشکر آقا مجتبی ، خیلی زیبا مفهوم رسانی کردید.

    من قبلا خیلی از ProcessMessages استفاده می کردم ولی الآن دیگه فقط و فقط Thread.


تاپیک های مشابه

  1. سوال: چرا نباید زیاد از frame استفاده کرد
    نوشته شده توسط ateryad در بخش طراحی وب (Web Design)
    پاسخ: 3
    آخرین پست: چهارشنبه 22 آذر 1391, 15:40 عصر
  2. مقاله:XML چیست و چرا دارای اهمیت فراوان است
    نوشته شده توسط babi_wd در بخش XML و کاربرد آن
    پاسخ: 15
    آخرین پست: دوشنبه 29 شهریور 1389, 09:30 صبح
  3. چرا باید از فایل ریسورس استفاده کرد
    نوشته شده توسط khoshblagh در بخش مباحث عمومی دلفی و پاسکال
    پاسخ: 3
    آخرین پست: دوشنبه 31 خرداد 1389, 15:06 عصر
  4. Application.ProcessMessages دقیقا در چه مواردی استفاده می شود؟
    نوشته شده توسط yaas135 در بخش برنامه نویسی در Delphi
    پاسخ: 4
    آخرین پست: سه شنبه 24 آبان 1384, 02:19 صبح
  5. معادل Application.ProcessMessages دلفی در سی شارپ ؟؟؟
    نوشته شده توسط iman_s52 در بخش C#‎‎
    پاسخ: 2
    آخرین پست: سه شنبه 24 خرداد 1384, 07:42 صبح

برچسب های این تاپیک

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

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