PDA

View Full Version : فرق اين دو دستور در عمل با هم چيه؟



seyed_farid
چهارشنبه 16 دی 1388, 19:46 عصر
Application.ProcessMessages;
Application.HandleMessages;

vcldeveloper
چهارشنبه 16 دی 1388, 22:24 عصر
HandleMessage فقط یک پیام رو از صفحه پیام های برنامه پردازش میکنه، و تا پایان پردازش اون پیام، اجرای برنامه متوقف میشه. اگر هم پیامی در صف وجود نداشته باشه، برنامه به حالت Idle میره.

ProcessMessages تمامی پیام های موجود در صف را پردازش میکنه، تا صف خالی بشه، و تا پایان کارش اجرای برنامه متوقف میشه. Process Messages هیج وقت برنامه را به حالت Idle نمیبره.

معمولا بهتر هست که از ProcessMessages استفاده کنید، غیر از اینکه واقعا کارکرد خاصی مدنظرتون باشه، و لازم باشه که در هر بار اجرا فقط یک پیام از صف پیام های برنامه پردازش بشه، یا اینکه بخواید در حین انجام یک پردازش طولانی، هر چند وقت یک بار کد اختصاص یافته به رویداد OnIdle را اجرا کنید.

seyed_farid
پنج شنبه 17 دی 1388, 02:01 صبح
من ميخوام تو بخشهايي از برنامم تو اجراي يك دستور ( يعني تو وسط چند خط از دستوراتم ) وقفه بندازم. مثلاً وقتي ميخوام اتصال كلاينت به سرور را ريفرش كنم اول يه قطع ميفرستم و بعدش وصل مي فرستم و تو وسط اين دو چند لحظه بايد وقفه بندازم تا اتصال قطع بشه. حالا با استفاده از دستور
procedure Waitms( Second : integer);//:Boolean;
var t : Integer;
begin
t:= GetTickCount;
while GetTickCount <= (t+Second)
do Application.ProcessMessages;
end;

اين كارو ميكنم. ولي يه اتفاق بدي كه ميفته اينه كه تو اين زمان وقفه برنامه هيچ پروسس ديگه اي را انجام نميده. آيا راه ديگه اي هم براش هست؟

يه توضيحي هم در مورد OnIdle بديد. ممنون

seyed_farid
پنج شنبه 17 دی 1388, 02:04 صبح
يه توضيحي هم در مورد OnIdle بديد كه چيه و چيكار ميكنه. ممنون

vcldeveloper
پنج شنبه 17 دی 1388, 02:51 صبح
اين كارو ميكنم. ولي يه اتفاق بدي كه ميفته اينه كه تو اين زمان وقفه برنامه هيچ پروسس ديگه اي را انجام نميده.
ProcessMessages خودش باعث میشه که برنامه همچنان Responsive باشه، و حالت Freeze شده پیدا نکنه.


حالا با استفاده از دستور
GetTickCount زمان را به میلی ثانیه برگشت میده، نه ثانیه. هر ثانیه 1000 میلی ثانیه هست، پس اون تابع شما باید مقدار پارامتر ورودی را ضربدر 1000 بکنه، بعد به t اضافه کنه.


يه توضيحي هم در مورد OnIdle بديد كه چيه و چيكار ميكنه.
رویدادی هست که در زمان بیکاری نرم افزار فراخوانی میشه؛ یعنی زمانی که کاربر با برنامه کاری نمیکنه، یا صف پیام های برنامه خالی هست.

seyed_farid
پنج شنبه 17 دی 1388, 09:03 صبح
ProcessMessages خودش باعث میشه که برنامه همچنان Responsive باشه، و حالت Freeze شده پیدا نکنه.
اما تواين زمان برنامه حالت فريز پيدا ميكنه چون مثلاً اگه بخوام تو اين زمان فرم رو جابجا كنم انجام نميده.


رویدادی هست که در زمان بیکاری نرم افزار فراخوانی میشه؛ یعنی زمانی که کاربر با برنامه کاری نمیکنه، یا صف پیام های برنامه خالی هست.
اونوقت كارTimerها اين وسط مانع اون نمي شه؟

vcldeveloper
پنج شنبه 17 دی 1388, 18:37 عصر
اما تواين زمان برنامه حالت فريز پيدا ميكنه چون مثلاً اگه بخوام تو اين زمان فرم رو جابجا كنم انجام نميده.
اون مشکل از ProcessMessages نیست.


اونوقت كارTimerها اين وسط مانع اون نمي شه؟
Timerها به پیام های WM_TIMER پاسخ میدند. اگر WM_TIMER ایی در صف پیام ها هست، پس برنامه Idle نیست.

seyed_farid
شنبه 19 دی 1388, 19:55 عصر
اون مشکل از ProcessMessages نیست.


پس از چه چيز ديگه اي ميتونه باشه؟ من كه فقط با همين دستور اين مورد برام پيش مياد.:افسرده: