Compartir a través de


estructura OVERRIDE_PREFETCH_PARAMETER (processthreadsapi.h)

Proporciona control adicional sobre la funcionalidad de captura previa de inicio de la aplicación (ALPF).

Sintaxis

typedef struct OVERRIDE_PREFETCH_PARAMETER {
  UINT32 Value;
} OVERRIDE_PREFETCH_PARAMETER;

Miembros

Value

Identificador único para diferenciar una vista o modo de aplicación.

Comentarios

La captura previa de inicio de la aplicación (ALPF) lleva los datos y las páginas de código a la memoria del disco antes de que se demande. La captura previa supervisa los datos y el código a los que se accede durante las startups de la aplicación y usa esa información al principio de las siguientes startups para leer el código y los datos de forma proactiva de forma eficaz para mejorar el rendimiento.

Si ALPF predice incorrectamente, se pueden capturar las páginas incorrectas, lo que ralentiza los inicios de la aplicación. Las aplicaciones con diferentes "vistas", como la vista de correo de Outlook o la vista de calendario, pueden provocar este problema si se necesitan páginas diferentes de memoria en función de la vista. Para resolver esto, las aplicaciones pueden pasar un parámetro de captura previa a su inicio a través de la línea de comandos, que proporcionará un identificador único para diferenciar entre vistas u otros escenarios que hacen que se produzca un error en la predicción estándar de ALPF.

Sin embargo, en algunos casos, la captura previa no siempre resuelve un error correctamente. Por ejemplo, los errores pueden producirse cuando diferentes rutas de acceso de código del mismo ejecutable requieren páginas diferentes, pero esas startups se iniciaron con el mismo parámetro de captura previa. Para resolver estos tipos de situaciones, una aplicación puede usar el OVERRIDE_PREFETCH_PARAMETER para invalidar el parámetro de captura previa del sistema (consulte la función SetProcessInformation).

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar las API de invalidación de captura previa cuando se inicia una aplicación con un parámetro de captura previa de línea de comandos de 2.

  1. Supongamos que este es el primer inicio de una aplicación, por lo que la instancia de la aplicación se designa como el proceso principal.
  2. Este proceso principal consulta el valor máximo permitido de un OVERRIDE_PREFETCH_PARAMETER.
  3. Una vez confirmado que el valor de invalidación es menor que este máximo (cuando la aplicación se inicia con un parámetro de captura previa de 2), se invalida con un valor de 9 mediante una llamada a la función SetProcessInformation mediante un valor ProcessInformation de ProcessOverrideSubsequentPrefetchParameter.
  4. ALPF sabe que se ha establecido un parámetro de captura previa de invalidación.
  5. Otra instancia de GenericApp.exe se inicia con un parámetro de captura previa de línea de comandos de 2. Esta instancia será transitoria, ya que ya existe un proceso principal.
  6. Dado que se ha establecido una invalidación de 2 a 9 para este ejecutable, ALPF obligará a esta instancia transitoria a iniciarse en el escenario 9 en lugar de 2.
  7. ALPF ahora captura las páginas adecuadas para el proceso principal en el escenario 2 y un conjunto independiente de páginas para los demás procesos en el escenario 9.
  8. Cuando se cierra el proceso principal de la aplicación, se quitará la invalidación, lo que permite que el siguiente inicio de GenericApp.exe se convierta en principal.
int main (int argc, char *argv[]) {
    
    BOOL IsThisProcessPrimary;
    
    IsThisProcessPrimary = CheckIfProcessPrimary();
    
    if (!IsThisProcessPrimary) {    
    // This process is transient; it does not call the Override Prefetch Parameter API.
    PassTransientDataToPrimary(argc, argv);    
    goto Exit;    
    } else {    
    // This process is primary; attempt to call Override Prefetch Parameter    
    // before doing primary initialization.    
    SetOverridePrefetchParameter(9);
    
    InitializeThisProcessAsPrimary(argc, argv);    
    DisplayToUserAndWait();    
    }
    
Exit:
    
    return 0;    
}

DWORD SetOverridePrefetchParameter (UINT32 OverrideParameter) {
    
    OVERRIDE_PREFETCH_PARAMETER ParamInfo;    
    DWORD ErrorCode;    
    BOOL Win32Success;
    
    ZeroMemory(&ParamInfo, sizeof(ParamInfo));
    
    // Get the maximum Override Prefetch Parameter from    
    // GetProcessInformation.
    
    Win32Success = GetProcessInformation(GetCurrentProcess(),    
        ProcessOverrideSubsequentPrefetchParameter,    
        &ParamInfo,    
        sizeof(ParamInfo));
    
    if (!Win32Success) {    
        ErrorCode = GetLastError();
        goto Exit;    
    }
    
    if (OverrideParameter <= ParamInfo.OverrideScenarioId) {    
        ParamInfo.Value = OverrideParameter;    
    } else {    
        // The Override Prefetch Parameter requested isn't valid on this system.    
        // Continue to launch without setting an Override Prefetch Parameter.    
        ErrorCode = ERROR_INVALID_PARAMETER;    
        goto Exit;    
    }
    
    Win32Success = SetProcessInformation(GetCurrentProcess(),    
        ProcessOverrideSubsequentPrefetchParameter,    
        &ParamInfo,    
        sizeof(ParamInfo));
    
    if (!Win32Success) {    
        ErrorCode = GetLastError();    
        goto Exit;    
    }
    
    Exit:    
        ErrorCode = ERROR_SUCCESS;    
        return ErrorCode;    
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Encabezado processthreadsapi.h

Consulte también

PROCESS_INFORMATION_CLASS enumeración, función GetProcessInformation