El conjunto de trabajo de una aplicación se recorta cuando se minimiza la ventana de nivel superior

Síntomas

Cuando se minimiza la ventana de nivel superior de la aplicación mediante el comando Minimizar del menú del sistema o hacer clic en el botón Minimizar , el sistema operativo se recorte el espacio de trabajo para el proceso. Esto se hace para liberar memoria RAM para aplicaciones en primer plano. Como resultado de este recorte, un proceso puede experimentar un rendimiento significativamente más pobre porque sus páginas de memoria que se tienen errores en la memoria RAM.

Más información

Si una aplicación minimiza su ventana de nivel superior mediante programación llamando a la API ShowWindow() con el comando SW_MINIMIZE, se recortará el conjunto de trabajo del proceso. Sin embargo, será del conjunto de trabajo no se recorta cuando la ventana está minimizada mediante programación mediante el uso de ShowWindow() con el comando SW_SHOWMINIMIZED.

El conjunto de trabajo de un proceso es el conjunto de páginas de memoria visibles actualmente para el proceso en la memoria RAM físico. Acceso a esta memoria es muy rápido porque las páginas son residentes y están disponibles para una aplicación que utilice sin desencadenar un error de página.

Un proceso puede recortar explícitamente su propio trabajo conjunto mediante una llamada a la API SetProcessWorkingSetSize() al pasar "-1" para los parámetros de la dwMinimumWorkingSetSize y la dwMaximumWorkingSetSize . Esto es básicamente cómo el sistema recorta el proceso cuando se minimiza la ventana de nivel superior. Esto no significa que las páginas de memoria utilizadas por el proceso se descartan inmediatamente desde la RAM. De hecho, estas páginas pueden permanecer residentes durante bastante tiempo. Simplemente se marcará para que el sistema puede utilizar para otros procesos según sea necesario. Esto es mucho más rápido que la espera en el algoritmo de recorte estándar del sistema.

Cuando una ventana está minimizada mediante el comando Minimizar en su menú de sistema o el botón Minimizar , la ventana se envía un mensaje WM_SYSCOMMAND con el comando SC_MINIMIZE. Si el procedimiento de ventana pasa este mensaje al procedimiento de ventana predeterminado del sistema por DefWindowProc() llamada, el procedimiento predeterminado controlará el mensaje por llamada ShowWindow() con el comando SW_MINIMIZE. Como se indicó anteriormente, esto hará que el proceso de trabajo que desee recortar.

Puede escribir una aplicación que se puede minimizar sin necesidad de su conjunto de trabajo recortada. Para ello, el procedimiento de ventana para la ventana de nivel superior debe interceptar el mensaje WM_SYSCOMMAND y responder al comando SC_MINIMIZE por llamada ShowWindow() directamente con el comando SW_SHOWMINIMIZED. No debe pasar el comando SC_MINIMIZE en DefWindowProc().

Código de ejemplo

El código siguiente muestra cómo escribir un procedimiento de ventana que intercepte el mensaje WM_SYSCOMMAND para omitir el procedimiento de ventana predeterminado y evitar el proceso de trabajo de que se recorte:

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);
}

Propiedades

Id. de artículo: 293215 - Última revisión: 21 ene. 2017 - Revisión: 1

Comentarios