View Full Version : سوال: Application.Terminated چیست ؟
saeed729
یک شنبه 19 خرداد 1392, 22:17 عصر
سلام دوستان
دستور Application.Terminated چیست و چه کاربردی دارد ؟
با تشکر.
Felony
یک شنبه 19 خرداد 1392, 23:25 عصر
دستور نیست ؛ متد Terminated به خودی خود کاری انجام نمیده و وظیفش صرفا اطلاع رسانی هست ، وقتی قصد بستن برنامه به هر روشی ( با استفاده از دکمه Close برنامه ، کد ، ارسال پیغام به برنامه و ... ) رو دارید ابتدا پیغام WM_Quit در صف پیغام های برنامه ثبت میشه ، این یعنی دستور بسته شدن برنامه صادر شد ، وقتی Message Handler برنامه به این پیغام میرسه ابتدا متد Terminated رو با True مقدار دهی میکنه و بعد برای بسته شدن برنامه باید کامپوننت های شئ Application و اشیا وابسته به اونها ( فرم ها و کنترل های دیگر ) آزاد بشن ، Memory Manager حافظه اختصاصی به برنامه رو آزاد کنه ( عملیات Cleanup ) ، عملیات FinilizeUnit انجام بشه و در آخر با صدا زده شدن تابه ExitProcess برنامه بسته بشه .
حالا این متد Terminated به چه دردی میخوره ؟
حتما شده تا به حال پردازش های زمان بری در برنامه داشته باشید که Main Thread رو به اون پردازش خاص مشغول کنه که وقتی قصد بستن برنامه با شیوه های معمول ( دکمه Close ، متد Application.Terminate و ... ) رو دارید برنامه چندین ثانیه بعد به درخواست شما مبنی بر بسته شدن پاسخ بده ، خوب کار این بنده خدا ( Application.Terminated ) این هست که به شما اطلاع رسانی میکنه که برنامه قصد داره بسته بشه ولی پردازش سنگین جنابعالی جلوش رو گرفته تا شما زودتر کارت رو جمع و جور کنی ، مثلا کد زیر رو در یک دکمه بنویسید :
var
i: Integer;
begin
for i := 0 to 100000 do
begin
Memo1.Lines.Add(IntToStr(i));
Application.ProcessMessages;
end;
end;
برنامه رو اجرا کنید و دکمه رو بزنید و حالا سعی کنید توسط دکمه Close فرم ، برنامه رو ببندید .
حالا کد رو به صورت زیر تغییر میدیم :
var
i: Integer;
begin
for i := 0 to 100000 do
begin
Memo1.Lines.Add(IntToStr(i));
if (Application.Terminated) then
Exit;
Application.ProcessMessages;
end;
end;
همونطور که میبینید برنامه خیلی راحت بسته میشه ، چون داخل حلقه ( کار پردازشی زمان بر و سنگین مورد نظر ) وقتی برنامه به من اطلاع رسانی کرد که باید بسته بشه ( Terminated = True ) من از ادامه عملیات سنگینم صرفنظر کردم .
مشابه همین روند داخل کلاس TThread دلفی هم هست ، یعنی هم متد Terminate داره و هم متد Terminated که با صدا زدن متد Terminate ترد ، متد Terminated با True مقدار دهی میشه که معنیش این هست که ترد تصمیم داره از حافظه خارج بشه ، شما هم وظیفه داری تو پردازش های زمانبرت تو متدهای تردت این فلگ رو چک کنی و اگر True بود پردازش رو لغو کنی تا ترد به کارش خاتمه بده .
موفق باشید .
saeed729
دوشنبه 20 خرداد 1392, 11:29 صبح
ممنون از راهنمایی شما.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.