PDA

View Full Version : حلقه مناسب به جای() Application->Run



orion188
جمعه 13 شهریور 1383, 14:04 عصر
سلام
من برنامه ای دارم که نمیخوام توش فرمی نمایش داده بشه. میخوام پشت صحنه در حال اجرا باشه. البته فرم اصلی داره و از رویدادهای کنترلهای متعلق به اون هم استفاده میکنم، اما صرفا" نمایشش نمیدم. این کار رو به این صورت انجام دادم که توی سورس خود پروژه (در تابع WinMain) ، دستور Application->Run() رو غیر فعال کردم و خودم به جای اون یک حلقه قرار دادم:


while(1)
{
Application->ProcessMessages();
}


یا این یکی :



while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}

حالا تنها مشکل اینه که وقتی توی TaskManager نگاه میکنم ، حدود 80 درصد CPU رو به خودش اختصاص داده.
1- راهی برای حل این مشکل وجود داره؟
2- اساسا" وقتی یه برنامه اجرا میشه ، چطور چنین کاری صورت میگیره؟ یعنی فرمها چطور منتظر رویدادها میمونن؟ من نمیتونم چنین کاری رو انجام بدم؟
3- راه بهتری برای این کار وجود داره؟ که برنامه فرم نداشته باشه؟ و در عین حال اجرا بشه (مثلا" Thread , ... کاربرد ندارن اینجا؟)

ممنون

Mohammad S
جمعه 13 شهریور 1383, 15:38 عصر
قبلا مطالب و تاپیکهایی در مورد این موضوع بود یعنی نشان ندادن فرم اصلی برنامه.
دقیقا یادم نیست ولی چیزی شبیه به این بود در ایونت OnCreate:
http://www.barnamenevis.org/forum/viewtopic.php?t=13132&highlight=%E3%CE%DD%ED+%DF%D1%CF%E4+%DD%D1%E3+%C7% D5%E1%ED+%C8%D1%E4%C7%E3%E5

Application.ShowMainForm:=False

MSK
جمعه 13 شهریور 1383, 21:13 عصر
Applicatio.ShowMainForm:=False;

ara_prg
شنبه 14 شهریور 1383, 23:14 عصر
البته اگر از روش خودت هم خواستی استفاده کنی فقط باید یک Sleep را در آخر حلقه اضافه کنی. مثلاَ عددی حدود 50 مناسب است. :wink:

orion188
یک شنبه 15 شهریور 1383, 09:30 صبح
ممنون از راهنماییهاتون :flower:

حالا خود فرمها چطور همچین کاری رو انجام میدن؟ رویدادهاشون چطور به ویندوز شناسونده میشه؟ و تو این فاصله که هنوز رویدادی نیومده ، چیکار میکنن؟ :lol: یعنی چطوری منتظر میمونن؟

MSK
یک شنبه 15 شهریور 1383, 11:21 صبح
البته وقتی یه فرم هاید میشه خیلی از رویدادها از کار میفتند مثل onmouseup و ... وفقط چند تا رویداد که متکی به خود اپلیکیشن هستند باقی می مونند مثل onclose .
میشه بپرسم شما چه جور رویدادهایی رو پوشش دادید.

_alish_
یک شنبه 15 شهریور 1383, 12:02 عصر
اگر بخواهی در صورتی که برنامه غیر فعال یا مینیموم است از آن استفاده شود بهتر است از Hook استفاده کنی

_alish_
یک شنبه 15 شهریور 1383, 12:18 عصر
اگر بخواهی در صورتی که برنامه غیر فعال یا مینیموم است از آن استفاده شود بهتر است از Hook استفاده کنی

orion188
یک شنبه 15 شهریور 1383, 14:04 عصر
سلام
منون از همه.
مشکل من با اون سوال اولی حل شده. الان بحث یه بحث دیگره(تقریبا" تحقیقاتی). میخوام بدونم اگه من بخوام از صفر یه application بنویسم ، چطوری باید حلقه انتظار رو ایجاد کنم. راههاش زیاده. اما میخوام بدونم راه استاندارد چیه.
متشکر

orion188
یک شنبه 15 شهریور 1383, 14:05 عصر
.... منظورم اینه که توی Winmain خودم همه کارو به دست بگیرم....

MSK
یک شنبه 15 شهریور 1383, 21:01 عصر
روش استانداردش همونیه که دلفی برای شما می نویسه. :قهقهه:
یعنی اگه شما طالب یه چیز استاندارد بی نقس بی دردسر می خواهید باید همونی رو که دلفی برای شما می نویسد را بنویسید. :shock:

من پیشنهاد می کنم کد مربوط به Application.Run رو مطالعه کنید(با نگه داشتن Ctrl و کلیک بر روی آن). :wink:

Inprise
دوشنبه 16 شهریور 1383, 10:43 صبح
راه بهتری برای این کار وجود داره؟ که برنامه فرم نداشته باشه؟

Win32 Service


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

اگر قراره برنامه ات UI داشته باشه ، توابع مربوط به ساخت پنجره ، اول کلاس پنجره رو رجیستر و بعدش روتین WndProcedure رو به پنجره اختصاص میدن ( بصورت کال بک ) و این روتین منتظر دریافت Windows Message ها باقی میمونه و تو میتونی با دریافت پیامها و پردازششون ، به موارد مطلوب جواب بدی .

اگر قراره برنامه ات UI نداشته باشه تو فقط با Win32 API طرف هستی و توابع معمول کتابخانه کلاست ، آبجکت پاسکال یا ++C .

موفق باشید