Partager via


OVERRIDE_PREFETCH_PARAMETER structure (processthreadsapi.h)

Fournit un contrôle supplémentaire sur la fonctionnalité ALPF (App Launch Prefetch).

Syntaxe

typedef struct OVERRIDE_PREFETCH_PARAMETER {
  UINT32 Value;
} OVERRIDE_PREFETCH_PARAMETER;

Membres

Value

Identificateur unique permettant de différencier une vue ou un mode d’application.

Remarques

La prérécupération de lancement d’application (ALPF) place les données et les pages de codes en mémoire à partir du disque avant qu’elles ne soient demandées. La prérécupération surveille les données et le code consultés lors du démarrage de l’application et utilise ces informations au début des start-ups suivantes pour lire le code et les données de manière proactive et améliorer les performances.

Si ALPF prédit incorrectement, les pages incorrectes peuvent être extraites, ce qui ralentit le lancement de l’application. Les applications avec différentes « vues », telles que l’affichage Courrier Outlook ou le mode Calendrier, peuvent provoquer ce problème en ayant besoin de différentes pages de mémoire en fonction de l’affichage. Pour résoudre ce problème, les applications peuvent passer un paramètre de prérécupération à leur lancement via la ligne de commande, ce qui fournira un identificateur unique pour différencier les vues ou d’autres scénarios qui entraînent l’échec de la prédiction standard ALPF.

Dans certains cas, toutefois, la prérécupération ne résout pas toujours correctement un échec. Par exemple, des échecs peuvent se produire lorsque différents chemins de code dans le même exécutable nécessitent des pages différentes, mais que ces start-ups ont été lancées avec le même paramètre de prérécupération. Pour résoudre ces types de situations, les OVERRIDE_PREFETCH_PARAMETER peuvent être utilisés par une application pour remplacer le paramètre de prérécupération système (voir Fonction SetProcessInformation).

Exemples

L’exemple de code suivant montre comment utiliser les API de remplacement de prérécupération lorsqu’une application démarre avec un paramètre de prérécupération de ligne de commande de 2.

  1. Supposons qu’il s’agit du premier lancement d’une application, de sorte que l’application instance se désigne comme processus principal.
  2. Ce processus principal interroge la valeur maximale autorisée d’un OVERRIDE_PREFETCH_PARAMETER.
  3. Une fois que la valeur de remplacement est inférieure à cette valeur maximale (lorsque l’application démarre avec un paramètre de prérécupération de 2), elle est remplacée par une valeur de 9 par un appel à la fonction SetProcessInformation à l’aide d’une valeur ProcessInformation de ProcessOverrideSubsequentPrefetchParameter.
  4. ALPF sait qu’un paramètre de prérécupération de remplacement a été défini.
  5. Une autre instance de GenericApp.exe est lancée avec un paramètre de prérécupération de ligne de commande de 2. Cette instance sera temporaire, car un processus principal existe déjà.
  6. Étant donné qu’un remplacement de 2 à 9 a été défini pour cet exécutable, ALPF force ce instance temporaire à se lancer dans le scénario 9 au lieu de 2.
  7. ALPF extrait désormais les pages appropriées pour le processus principal dans le scénario 2 et un ensemble distinct de pages pour les autres processus dans le scénario 9.
  8. Lorsque le processus principal de l’application se ferme, le remplacement est supprimé, ce qui permet au prochain lancement de GenericApp.exe de devenir 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;    
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows XP [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau uniquement]
En-tête processthreadsapi.h

Voir aussi

énumération PROCESS_INFORMATION_CLASS, fonction GetProcessInformation