PDA

View Full Version : سوال: استفاده از application.processmessage



Mask
سه شنبه 27 اردیبهشت 1390, 15:52 عصر
با سلام
اگه به کرات از این دستور استفاده بشه چه اتفاقی میوفته؟
من در چند جایی از برنامم از این دستور استفاده میکنم.جدیدا برنامم شروع کرده و AV میده.
آیا میتونه از این باشه.؟

یوسف زالی
سه شنبه 27 اردیبهشت 1390, 16:07 عصر
سلام.
این دستور به سیستم عامل می گه من پروسه در حال اجرا هستم نه هنگ.
یعنی اگه مثلا یه حلقه طولانی بنویسی که 30 ثانیه طول می کشه ممکنه فرمت شبیه فرمهای هنگ شه و کمرنگ شه و ماوس توش موقتا شکل ساعت شنی شه و progressbar هات از کار بیفته.
با این دستور سیستم عامل یه بار دیگه فرم رو معتبر میشناسه.
زیادش خیلی خوب نیست.ممکنه کند شی .
در ضمن اگه وسط اجرای حلقه مثلا نباید دکمه فلان چیز رو تو فرمت بزنن اما اون دکمه enable باشه با فراخوانی این دستور دکمه قابل زدن هست.
اگه هندلینگت واسه کنترل ها خوب باشه وسط حلقه های بزرگ مثلا هر 10 ثانیه یه بار کال کن تا progressbar هات هم از کار نیفتن.
error بعیده به اون ربط داشته باشه.

Felony
سه شنبه 27 اردیبهشت 1390, 16:36 عصر
Application.ProcessMessage به عنوان یک وقفه برای برنامه عملی میکنه و با صدا زدنش شما برنامه رو وادار میکنید روال عادی کار رو معلق کنه و به پیغام های موجود تو صف رسیدگی کنه و اون ها رو پردازش کنه ، این کار تا زمانی که صف پیغام ها خالی بشه ادامه پیدا مکینه و بعد از پایان پردازش پیغام های موجود در صف روند اجرای برنامه دوباره شروع میشه و ادامه پیدا میکنه .

وقتی شما مثلا در یک حلقه از 1 تا 1,000,000 دارید دور میزنید و وسط کار Application.ProcessMessage رو صدا میزنید عملا اون کار حلقه رو موقتا متوقف میکنید و به Main Thread میگید که به Message Queue رسیدگی کن حالا ممکنه تو صف پیغام ها هر چیزی باشه ( تغییر متن یک دکمه ، نمایش پیغام ، به روز رسانی رابط کاربری یا هر چیز دیگه ای ) و Main Thread موظف میشه تا پایان پردازش تمام پیغام های موجود تو صف این روند رو ادامه بده و بعد از اتمام پیغام های موجود تو صف به روند اجرای حلقه برگرده .

حالا اینکه ازش استفاده کنید یا نکنید بستگی به کاربرد مورد نظرتون داره ، فکر میکنم توضیحات به اندازه کافی واضح بوده باشه که بتونید در موردش تصمیم گیری کنید .

a_mosavian
چهارشنبه 28 اردیبهشت 1390, 18:24 عصر
از تابع ProcessMessage استفاده نکن بجاش از HandleMessage استفاده کن.
علت اینه که یه برنامه بنویس و تابع نخست رو بذار در یک لوپ بی پایان می بینی که درصد مصرف CPU میره روی 100 درصد! (اگر 2 هسته ای باشه 50%). ولی تابع دوم همون صفر درصد می مونه. تابع نخست برای هنگامی است که منتظر پیغام هایی هستید که realtime باید اجرا شه. معمولا ورودی های کاربر اینگونه نیست و تابع دوم کاراتره.

a_mosavian
چهارشنبه 28 اردیبهشت 1390, 18:29 عصر
سلام.
این دستور به سیستم عامل می گه من پروسه در حال اجرا هستم نه هنگ.
یعنی اگه مثلا یه حلقه طولانی بنویسی که 30 ثانیه طول می کشه ممکنه فرمت شبیه فرمهای هنگ شه و کمرنگ شه و ماوس توش موقتا شکل ساعت شنی شه و progressbar هات از کار بیفته.
با این دستور سیستم عامل یه بار دیگه فرم رو معتبر میشناسه.
زیادش خیلی خوب نیست.ممکنه کند شی .
در ضمن اگه وسط اجرای حلقه مثلا نباید دکمه فلان چیز رو تو فرمت بزنن اما اون دکمه enable باشه با فراخوانی این دستور دکمه قابل زدن هست.
اگه هندلینگت واسه کنترل ها خوب باشه وسط حلقه های بزرگ مثلا هر 10 ثانیه یه بار کال کن تا progressbar هات هم از کار نیفتن.
error بعیده به اون ربط داشته باشه.

اینگونه نیست. این تابع تنها پیغام های درون صف رو پردازش می کنه. برخلاف تابع HandleMessage تا آخرین پیغام هم پردازش می کنه (البته این رو مطمئن نیستم!) و سپس اجازه می ده روتین ادامه پیدا کنه. سیستم عامل از روی اینکه خالی شدن صف می فهمه برنامه هنگ کرده یا نه و برنامه لازم نیست چیزی به سیستم عامل اعلام کنه. مثل صف نانوایی که هنگامی که حرکت نمی کنه ما می فهمیم نون پخت نمیشه حتی اگر سرمون رو توی مغازه نکنیم!

tdkhakpur
چهارشنبه 28 اردیبهشت 1390, 18:40 عصر
از تابع ProcessMessage استفاده نکن بجاش از HandleMessage استفاده کن.


استفاده از متدی که ذکر کردید برای شرایطی هست که میخواهید منتظر بمانید تاپیغامی از ویندوز برنامه شما رو متوجه خود بکند در صورتی که ProcessMessage ویندوز رو برای اجرای پیغامها یا گوش دادن به پیغامها وادار میکنه و در ضمن اجرای حلق رو هم متوقف نمیکنه.


و تابع نخست رو بذار در یک لوپ بی پایان می بینی که درصد مصرف CPU میره روی 100 درصد! (اگر 2 هسته ای باشه 50%). ولی تابع دوم همون صفر درصد می مونه

اگر در هر شرایطی برنامه دچار حلقه بشه این درصد همیشه باید بالا بره در صورتی که شما با این کارتون منتظر دریافت یا سیگنال توسط ویندوز میشید به همین دلیل درصد استفاده از cpu صفر میمونه.

tdkhakpur
چهارشنبه 28 اردیبهشت 1390, 18:51 عصر
برخلاف تابع HandleMessage تا آخرین پیغام هم پردازش می کنه (البته این رو مطمئن نیستم!)
تا اونجایی که cpu توان و سرعت داره میتونه پیغامها رو جواب بده که این ارتباط مستقیمی با کدهای پس از دریافت پیغام داره تا دوباره این متد اجرا شده برای دریافت پیغام منتظر بمونه


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

اساس این متد برای زمانهای به کار برده میشه که بخواهید برنامه اتوماسیون صنعتی بنوسید یا برنانه های ارسال اطلاعات توسط شبکه که برنامه برای اجرا نیاز داشته باشه که به وضعیت دستگاههای جانبی گوش بدید و برای اینکه درصد cpu بالا نره و منتظر بمونه تا پیغامی از دستگاهها برای برنامه شما برسه.

a_mosavian
پنج شنبه 29 اردیبهشت 1390, 18:19 عصر
استفاده از متدی که ذکر کردید برای شرایطی هست که میخواهید منتظر بمانید تاپیغامی از ویندوز برنامه شما رو متوجه خود بکند در صورتی که ProcessMessage ویندوز رو برای اجرای پیغامها یا گوش دادن به پیغامها وادار میکنه و در ضمن اجرای حلق رو هم متوقف نمیکنه.
اگر در هر شرایطی برنامه دچار حلقه بشه این درصد همیشه باید بالا بره در صورتی که شما با این کارتون منتظر دریافت یا سیگنال توسط ویندوز میشید به همین دلیل درصد استفاده از cpu صفر میمونه.
تا اونجایی که cpu توان و سرعت داره میتونه پیغامها رو جواب بده که این ارتباط مستقیمی با کدهای پس از دریافت پیغام داره تا دوباره این متد اجرا شده برای دریافت پیغام منتظر بمونه
اساس این متد برای زمانهای به کار برده میشه که بخواهید برنامه اتوماسیون صنعتی بنوسید یا برنانه های ارسال اطلاعات توسط شبکه که برنامه برای اجرا نیاز داشته باشه که به وضعیت دستگاههای جانبی گوش بدید و برای اینکه درصد cpu بالا نره و منتظر بمونه تا پیغامی از دستگاهها برای برنامه شما برسه.


ادعای مطرح شده توسط شما در Docwiki موجود نمی باشد! هر دو اجرای روتین را دچار Interrupt می کنند :بامزه: تفاوت ProcessMessages و HandleMessage بر پایه سند رسمی خود سایت تنها در پردازش یک پیغام از صف در HandleMessage و همه صف در ProcessMessages میباشد که بنده هم ذکر کرده بودم (البته گفته بودم مطمئن نیستم که اکنون مطمئن شدم!) نتیجه کار هر دو اینست که ویندوز با توجه به جلو رفتن صف برنامه را هنگ کرده در نظر نمی گیرد! و همانطور که بنده ذکر کرده بودم در پروسه های مهم و Realtime از ProcessMessages استفاده کنید.

do not call HandleMessage when waiting for something message-based while priority actions are also being processed. Instead, call ProcessMessages when processing more than just messages.
http://docwiki.embarcadero.com/VCL/en/Forms.TApplication.HandleMessage
http://docwiki.embarcadero.com/VCL/en/Forms.TApplication.ProcessMessages
که همانطور که گفتم معمولا در ورودی های کاربر با این شرایط روبرو نیستیم. (با فیلترشکن به سایت های بالا مراجعه کنید چون ایران تحریم است!)
در مورد بقیه ادعاهای مطروحه حوصله بحث ندارم!

tdkhakpur
پنج شنبه 29 اردیبهشت 1390, 19:19 عصر
در مورد بقیه ادعاهای مطروحه حوصله بحث ندارم!
خودت بافتی و خودت هم دوختی!
یک بار با comment برای بالایی و یک بار برای پایین امتحان کن ببین منتظر پیغام میمونه یا نه!


procedure TForm1.Button1Click(Sender: TObject);
var
I, J, X, Y: Word;
begin
I := 0;
J := 0;
while I <164000 do
begin
Randomize;
while J < 164000 do
begin
Y := Random(J);
Inc(J);
// Application.ProcessMessages;
Application.HandleMessage;
Form1.Caption := intToStr(j);
end;
X := Random(I);
Inc(I);
end;
Canvas.TextOut(10, 10, 'The Button1Click handler is finished');
end;

a_mosavian
سه شنبه 03 خرداد 1390, 17:35 عصر
خودت بافتی و خودت هم دوختی!
یک بار با comment برای بالایی و یک بار برای پایین امتحان کن ببین منتظر پیغام میمونه یا نه!


procedure TForm1.Button1Click(Sender: TObject);
var
I, J, X, Y: Word;
begin
I := 0;
J := 0;
while I <164000 do
begin
Randomize;
while J < 164000 do
begin
Y := Random(J);
Inc(J);
// Application.ProcessMessages;
Application.HandleMessage;
Form1.Caption := intToStr(j);
end;
X := Random(I);
Inc(I);
end;
Canvas.TextOut(10, 10, 'The Button1Click handler is finished');
end;


این کد دقیقا قراره چه کنه؟! چه پیغامی رو پردازش کنه؟

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

tdkhakpur
سه شنبه 03 خرداد 1390, 19:11 عصر
من از خودم چیزی نبافتم. اگر مشکل انگلیسی دارید با گوگل ترانسلیت به فارسی ترجمه کنید

رفتم ترجمه کنم.