OVERRIDE_PREFETCH_PARAMETER-Struktur (processthreadsapi.h)

Bietet zusätzliche Kontrolle über die Alpf-Funktionalität (App Launch Prefetch).

Syntax

typedef struct OVERRIDE_PREFETCH_PARAMETER {
  UINT32 Value;
} OVERRIDE_PREFETCH_PARAMETER;

Member

Value

Ein eindeutiger Bezeichner zum Unterscheiden einer Anwendungsansicht oder eines Anwendungsmodus.

Hinweise

App Launch Prefetch (ALPF) bringt Daten und Codepages vom Datenträger in den Arbeitsspeicher, bevor sie benötigt werden. Beim Vorabrufen werden die Daten und der Code überwacht, auf die bei Anwendungs-Startups zugegriffen wird, und diese Informationen zu Beginn nachfolgender Startups verwendet, um den Code und die Daten proaktiv auf effiziente Weise zu lesen, um die Leistung zu verbessern.

Wenn ALPF falsch vorhersagt, werden möglicherweise die falschen Seiten abgerufen, wodurch der App-Start verlangsamt wird. Anwendungen mit unterschiedlichen "Ansichten", z. B. Outlook-E-Mail- oder Kalenderansicht, können dieses Problem verursachen, da je nach Ansicht unterschiedliche Seiten Arbeitsspeicher benötigt werden. Um dies zu beheben, können Anwendungen einen Vorabrufparameter über die Befehlszeile an ihren Start übergeben. Dadurch wird ein eindeutiger Bezeichner bereitgestellt, um zwischen Ansichten oder anderen Szenarien zu unterscheiden, die dazu führen, dass die ALPF-Standardvorhersage fehlschlägt.

In einigen Fällen löst das Vorabrufen einen Fehler jedoch nicht immer erfolgreich. Beispielsweise können Fehler auftreten, wenn unterschiedliche Codepfade in derselben ausführbaren Datei unterschiedliche Seiten erfordern, diese Startups jedoch mit demselben Prefetch-Parameter gestartet wurden. Um diese Arten von Situationen zu beheben, kann der OVERRIDE_PREFETCH_PARAMETER von einer App verwendet werden, um den Systemvorrufparameter zu überschreiben (siehe SetProcessInformation-Funktion).

Beispiele

Im folgenden Codebeispiel wird gezeigt, wie Sie die APIs für die Vorabrufüberschreibung verwenden, wenn eine App mit dem Befehlszeilenvorrufparameter 2 gestartet wird.

  1. Angenommen, dies ist der erste Start einer App, sodass die App instance sich selbst als primären Prozess bezeichnet.
  2. Dieser primäre Prozess fragt den maximal zulässigen Wert eines OVERRIDE_PREFETCH_PARAMETER ab.
  3. Nachdem bestätigt wurde, dass der Überschreibungswert kleiner als dieses Maximum ist (wenn die App mit einem Prefetch-Parameter von 2 gestartet wird), wird er durch einen Aufruf der SetProcessInformation-Funktion mithilfe des ProcessInformation-WertsProcessOverrideSubsequentPrefetchParameter mit dem Wert 9 überschrieben.
  4. ALPF weiß, dass ein Override Prefetch Parameter festgelegt wurde.
  5. Eine weitere instance von GenericApp.exe wird mit dem Befehlszeilenvorrufparameter 2 gestartet. Dieser instance ist vorübergehend, da bereits ein primärer Prozess vorhanden ist.
  6. Da für diese ausführbare Datei eine Außerkraftsetzung von 2 auf 9 festgelegt wurde, erzwingt ALPF den Start dieser vorübergehenden instance in Szenario 9 anstelle von 2.
  7. ALPF ruft nun die entsprechenden Seiten für den primären Prozess unter Szenario 2 und einen separaten Satz von Seiten für die anderen Prozesse unter Szenario 9 ab.
  8. Wenn der primäre Prozess der App geschlossen wird, wird die Außerkraftsetzung entfernt, sodass der nächste Start von GenericApp.exe primär wird.
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;    
}

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [nur Desktop-Apps]
Kopfzeile processthreadsapi.h

Weitere Informationen

PROCESS_INFORMATION_CLASS-Enumeration, GetProcessInformation-Funktion