PDA

View Full Version : سوال: کنترل برنامه!؟



hi.alir
شنبه 02 مرداد 1389, 10:56 صبح
وقتی که یه برنامه ی Win32 می نویسیم، معمولا از یه حلقه ی while واسه پردازش اطلاعات ارسال شده به برنامه استفاده می کنیم و این حلقه تا زمان حیات برنامه ادامه داره.
مشکلی که اینکار ایجاد می کنه اینه که اینطوری برنامه چه کار مفیدی انجام بده چه نده داره از CPU استفاده میکنه و از زمانی که اجرا بشه تا بسته بشه تمام توان CPU رو به کار میبره.
سوال من اینه که چطور از چنین اتفاقی جلوگیری کنم؟

tdkhakpur
شنبه 02 مرداد 1389, 13:35 عصر
سوال من اینه که چطور از چنین اتفاقی جلوگیری کنم؟

از تابع WaitMessage استفاده کنید تا به هنگام وقفه برای cpu عکس العمل نشان بدهد اگر پیغامی ارسال شده باشد مقدار برگشتی true خواهد بود بعد از این مرحله میتوانید GetMessage را فراخوانی کنید.
برای اطلاعات بیشتر در مورد نحوه استفاده به help مراجعه کنید.

hi.alir
شنبه 02 مرداد 1389, 15:31 عصر
وقتی از توابع GetMessage با WaitMessage در حلقه ی برنامه استفاده کنی ، میتونی مقدار استفاده از CPU رو در Task Manager ببینی که 0 هست.و در اینجا از CPU به اون صورتی که شما فکر میکنی استفاده نمیشه.
اره این رو خودم فهمیدم که اشتباه کردم، باکش کردم.


درسته ، ولی اجتیاجی به WaitMessage نیست.
چون که GetMessage کار WaitMessage و PeekMessage رو تقزیبا با هم انجام میده.
احتمالا منظورتون از GetMessage در اینجا PeekMessage بوده.
در واقع PeekMessage منتظر نمیمونه تا پیغامی دریافت بشه.فقط صف پیغام ها رو چک میکنه.(بلاک نمیکنه)
ولی GetMessage منتظر میمونه تا وقتی که پیغامی در صف به وجود بیاد.(بلاک میکنه
بله، ممنون
فقط یه چیز دیگه. این WaitMessage چطور اینکار رو انجام میده؟

tdkhakpur
شنبه 02 مرداد 1389, 16:56 عصر
فقط یه چیز دیگه. این WaitMessage چطور اینکار رو انجام میده؟

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


void task1();
void task2();
void task3();
چرخه اصلی سیستم عامل
while(endof os)
{
switch(taskNo)
{
0: if( Harware intruptted && task0 not Waited) task1();
1: if( Harware intruptted && task1 not Waited) task2();
2: if( Harware intruptted && task2 not Waited) task3();
}
}
اگر شما داخل کار جاری بصورت زیر
WaitMessage on task1
متد را اجرا کنید
task2 Waited = true
میشود و داخل چرخه اصلی شرایط برای پردازش کار به تعلیق می افتد.

برای اطلاعات بیشتر در این مورد میتوانید به 80468 progmming مراجعه کنید داخل ان میتوانید به بسیاری از switch های اصلی را برای پردازشها حالت حفاظت شده اشاره کرده پی ببرید.