Compartilhar via


estrutura OVERRIDE_PREFETCH_PARAMETER (processthreadsapi.h)

Fornece controle adicional sobre a funcionalidade alpf (pré-busca de inicialização de aplicativo).

Sintaxe

typedef struct OVERRIDE_PREFETCH_PARAMETER {
  UINT32 Value;
} OVERRIDE_PREFETCH_PARAMETER;

Membros

Value

Um identificador exclusivo para diferenciar uma exibição ou modo de aplicativo.

Comentários

O ALPF (App Launch Prefetch) traz dados e páginas de código para a memória do disco antes que ele seja exigido. A pré-busca monitora os dados e o código acessados durante as inicializações do aplicativo e usa essas informações no início das startups subsequentes para ler o código e os dados proativamente de maneira eficiente para melhorar o desempenho.

Se o ALPF prever incorretamente, as páginas erradas poderão ser buscadas, retardando a inicialização do aplicativo. Aplicativos com diferentes "Modos de Exibição", como o Modo de Exibição de Email do Outlook ou o Modo de Exibição de Calendário, podem causar esse problema precisando de diferentes páginas de memória, dependendo do Modo de Exibição. Para resolver isso, os aplicativos podem passar um parâmetro de pré-busca para sua inicialização por meio da linha de comando, o que fornecerá um identificador exclusivo para diferenciar entre Exibições ou outros cenários que fazem com que a previsão padrão alpf falhe.

Em alguns casos, no entanto, a pré-busca nem sempre resolve uma falha com êxito. Por exemplo, falhas podem ocorrer quando caminhos de código diferentes no mesmo executável exigem páginas diferentes, mas essas inicializações foram iniciadas com o mesmo parâmetro de pré-busca. Para resolve esses tipos de situações, o OVERRIDE_PREFETCH_PARAMETER pode ser usado por um aplicativo para substituir o parâmetro de pré-busca do sistema (consulte a função SetProcessInformation).

Exemplos

O exemplo de código a seguir mostra como usar as APIs de substituição de pré-busca quando um aplicativo é iniciado com um parâmetro de pré-busca de linha de comando de 2.

  1. Suponha que esta seja a primeira inicialização de um aplicativo, portanto, a instância do aplicativo designa-se como o processo primário.
  2. Esse processo primário consulta o valor máximo permitido de um OVERRIDE_PREFETCH_PARAMETER.
  3. Depois de confirmado que o valor de substituição é menor que esse máximo (quando o aplicativo é iniciado com um parâmetro de pré-busca de 2), ele é substituído por um valor de 9 por uma chamada para a função SetProcessInformation usando um valor ProcessInformation de ProcessOverrideSubsequentPrefetchParameter.
  4. O ALPF sabe que um parâmetro de pré-busca de substituição foi definido.
  5. Outra instância do GenericApp.exe é iniciada com um parâmetro de pré-busca de linha de comando de 2. Essa instância será transitória, pois já existe um processo primário.
  6. Como uma substituição de 2 a 9 foi definida para esse executável, o ALPF forçará essa instância transitória a ser iniciada no cenário 9 em vez de 2.
  7. O ALPF agora busca páginas apropriadas para o processo primário no cenário 2 e um conjunto separado de páginas para os outros processos no cenário 9.
  8. Quando o processo primário do aplicativo for fechado, a substituição será removida, permitindo que a próxima inicialização de GenericApp.exe se torne primária.
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 Valor
Cliente mínimo com suporte Windows XP [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2003 [somente aplicativos da área de trabalho]
Cabeçalho processthreadsapi.h

Confira também

PROCESS_INFORMATION_CLASS enumeração, função GetProcessInformation