قطع مجموعة العمل للتطبيق عندما يتم تصغير إطار المستوى الأعلى الخاص به

الأعراض

عندما يتم تصغير إطار المستوى الأعلى للتطبيق من خلال الأمر تصغير من قائمتها النظام أو نقر فوق الزر تصغير الخاص به، نظام التشغيل بقطع العمل المعينة للعملية. يتم ذلك لتحرير ذاكرة الوصول العشوائي للطلبات المقدمة. ونتيجة لهذا الاقتطاع، قد تواجه عملية أداء أضعف إلى حد كبير لأنه يتم الآن أخطاء صفحات الذاكرة الخاصة به إلى ذاكرة الوصول العشوائي.

مزيد من المعلومات

يقلل تطبيق إطار المستوى الأعلى الخاص به برمجياً عن طريق استدعاء API ShowWindow() باستخدام الأمر SW_MINIMIZE، سيتم اقتطاع مجموعة العمل الخاصة بالعملية. مع ذلك، تعيين العمل سوف لا يتم اقتطاعها عندما يتم تصغير الإطار برمجياً من خلال استخدام ShowWindow() بواسطة الأمر SW_SHOWMINIMIZED.

مجموعة العمل الخاصة بعملية هو المجموعة صفحات الذاكرة المعروضة حاليا بالعملية في الذاكرة RAM الفعلية. يتم الوصول إلى هذه الذاكرة سريعة جداً لأن الصفحات الموجودة والمتوفرة لأحد تطبيقات باستخدام دون أحداث خطأ صفحة.

عملية بشكل صريح تقليم مجموعة العمل الخاصة به عن طريق استدعاء SetProcessWorkingSetSize() API أثناء تمرير "-1" للمعلمات دومينيمومووركينجسيتسيزي ودوماكسيمومووركينجسيتسيزي . هذا بشكل أساسي كيفية العملية اقتطاع النظام عندما يتم تصغير إطار المستوى الأعلى الخاص به. هذا يعني أنه يتم تجاهل صفحات الذاكرة المستخدمة من قبل العملية مباشرة من ذاكرة الوصول العشوائي. وفي الواقع، هذه الصفحات قد تظل المقيمين لفترة طويلة. بساطة يعلم ذلك النظام يمكن استخدامها لعمليات أخرى حسب الضرورة. وهذا أسرع بكثير من انتظار خوارزمية اقتطاع القياسية الخاصة بالنظام.

عند تصغير إطار من خلال الأمر تصغير من قائمتها النظام أو زر التصغير ، يتم إرسال الإطار رسالة WM_SYSCOMMAND باستخدام الأمر SC_MINIMIZE. إجراء الإطار بتمرير هذه الرسالة إلى إجراء الإطار الافتراضي للنظام عن طريق استدعاء DefWindowProc()، سيقوم الإجراء الافتراضي الرسالة عن طريق استدعاء ShowWindow() باستخدام الأمر SW_MINIMIZE. وكما ذكر آنفا، سيؤدي هذا عملية مجموعة إلى التقليم للعمل.

يمكنك كتابة تطبيق يمكن التقليل من دون قطع مجموعة العمل الخاصة بها. للقيام بذلك، يجب إجراء الإطار لإطار المستوى الأعلى اعتراض رسالة WM_SYSCOMMAND والاستجابة للأمر SC_MINIMIZE باستدعاء ShowWindow() مباشرة باستخدام الأمر SW_SHOWMINIMIZED. ينبغي إلا تمر الأمر SC_MINIMIZE إلى DefWindowProc().

نموذج لتعليمة برمجية

التعليمة البرمجية التالية يوضح كيفية كتابة إجراء إطار يعترض الرسالة WM_SYSCOMMAND لتجاوز إجراء الإطار الافتراضي ومنع العملية مجموعة من يتم اقتطاع العمل:

LRESULT CALLBACK WndProc (HWND hWnd, UINT iMsg, WPARAM wParam,       LPARAM lParam) {

switch (iMsg) {

case WM_SYSCOMMAND:
if (wParam == SC_MINIMIZE) {

// programmatically minimize the window
ShowWindow(hWnd, SW_SHOWMINIMIZED);

// do not pass the minimize command on to the system's
// default window procedure
return 0;
}

// allow other system commands to be passed on to the
// default window procedure
break;

// handle other window messages here...
case WM_WHATEVER:
break;
}

return DefWindowProc(hWnd, iMsg, wParam, lParam);
}

خصائص

رقم الموضوع: 293215 - آخر مراجعة: 22‏/01‏/2017 - المراجعة: 1

تعليقات