struttura OVERRIDE_PREFETCH_PARAMETER (processthreadsapi.h)

Fornisce un controllo aggiuntivo sulla funzionalità prelettura di avvio app (ALPF).

Sintassi

typedef struct OVERRIDE_PREFETCH_PARAMETER {
  UINT32 Value;
} OVERRIDE_PREFETCH_PARAMETER;

Members

Value

Identificatore univoco per la differenziazione di una visualizzazione o una modalità dell'applicazione.

Commenti

Il prelettura di avvio dell'app (ALPF) porta i dati e le tabelle codici in memoria dal disco prima che venga richiesto. La prelettura monitora i dati e il codice a cui si accede durante le startup dell'applicazione e usa tali informazioni all'inizio delle startup successive per leggere il codice e i dati in modo proattivo in modo efficiente per migliorare le prestazioni.

Se ALPF prevede erroneamente, le pagine errate potrebbero essere recuperate, rallentando l'avvio dell'app. Le applicazioni con visualizzazioni diverse, ad esempio visualizzazione posta di Outlook o visualizzazione calendario, possono causare questo problema richiedendo pagine di memoria diverse a seconda della visualizzazione. Per risolvere questo problema, le applicazioni possono passare un parametro di prelettura al relativo avvio tramite la riga di comando, che fornirà un identificatore univoco per distinguere le visualizzazioni o altri scenari che causano l'esito negativo della stima standard ALPF.

In alcuni casi, tuttavia, il prelettura non risolve sempre un errore. Ad esempio, gli errori possono verificarsi quando percorsi di codice diversi nello stesso eseguibile richiedono pagine diverse, ma tali avvio sono stati avviati con lo stesso parametro di prelettura. Per risolvere questi tipi di situazioni, il OVERRIDE_PREFETCH_PARAMETER può essere usato da un'app per eseguire l'override del parametro di prelettura di sistema (vedere Funzione SetProcessInformation).

Esempio

L'esempio di codice seguente illustra come usare le API di override del prelettura quando un'app viene avviata con un parametro di prelettura della riga di comando pari a 2.

  1. Si supponga che questo sia il primo avvio di un'app, quindi l'istanza dell'app si designa come processo primario.
  2. Questo processo primario esegue una query sul valore massimo consentito di un OVERRIDE_PREFETCH_PARAMETER.
  3. Dopo aver confermato che il valore di override è minore di questo valore massimo (quando l'app viene avviata con un parametro di prelettura pari a 2), viene sottoposto a override con un valore pari a 9 da una chiamata alla funzione SetProcessInformation usando un valore ProcessInformation di ProcessOverrideSubsequentPrefetchParameter.
  4. ALPF sa che è stato impostato un parametro di prelettura di override.
  5. Viene avviata un'altra istanza di GenericApp.exe con un parametro di prelettura della riga di comando pari a 2. Questa istanza sarà temporanea perché esiste già un processo primario.
  6. Poiché per questo eseguibile è stato impostato un override compreso tra 2 e 9, ALPF forza l'avvio di questa istanza temporanea nello scenario 9 anziché 2.
  7. ALPF recupera ora le pagine appropriate per il processo primario nello scenario 2 e un set separato di pagine per gli altri processi nello scenario 9.
  8. Quando il processo primario dell'app viene chiuso, l'override verrà rimosso, consentendo il successivo avvio di GenericApp.exe diventare primario.
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;    
}

Requisiti

Requisito Valore
Client minimo supportato Windows XP [solo app desktop]
Server minimo supportato Windows Server 2003 [solo app desktop]
Intestazione processthreadsapi.h

Vedi anche

enumerazione PROCESS_INFORMATION_CLASS, funzione GetProcessInformation