共用方式為


OVERRIDE_PREFETCH_PARAMETER結構 (processthreadsapi.h)

提供應用程式啟動預先擷取 (ALPF) 功能的額外控制。

語法

typedef struct OVERRIDE_PREFETCH_PARAMETER {
  UINT32 Value;
} OVERRIDE_PREFETCH_PARAMETER;

成員

Value

用於區分應用程式檢視或模式的唯一標識碼。

備註

應用程式啟動預先擷取 (ALPF) 在要求之前,將數據和代碼頁帶入磁碟記憶體。 預先擷取會監視應用程式啟動期間存取的數據和程序代碼,並在後續啟動開始時使用該資訊主動讀取程式碼和數據,以改善效能。

如果 ALPF 預測不正確,可能會擷取錯誤的頁面,讓應用程式啟動變慢。 具有不同「檢視」的應用程式,例如 Outlook 郵件檢視或行事曆檢視,可能會根據檢視需要不同的記憶體頁面來造成此問題。 若要解決此問題,應用程式可以透過命令行將預先擷取參數傳遞至其啟動,以提供唯一標識符來區分造成ALPF標準預測失敗的檢視或其他案例。

不過,在某些情況下,預先擷取不一定會成功解決失敗。 例如,當相同可執行檔中的不同程式代碼路徑需要不同的頁面,但這些啟動是使用相同的預先擷取參數啟動時,就會發生失敗。 若要解決這些類型的情況,應用程式可以使用OVERRIDE_PREFETCH_PARAMETER來覆寫系統預先擷取參數 (請參閱 SetProcessInformation 函 式) 。

範例

下列程式代碼範例示範當應用程式以命令行預先擷取參數 2 啟動時,如何使用預先擷取覆寫 API。

  1. 假設這是應用程式的第一次啟動,因此應用程式實例會將本身指定為主要進程。
  2. 這個主要進程會查詢 OVERRIDE_PREFETCH_PARAMETER允許的最大值。
  3. 一旦確認覆寫值小於此最大值 (時,當應用程式以預先擷取參數 2) 啟動時,會使用 ProcessOverrideSubsequentPrefetchParameterProcessInformation 值,以 9 的值覆寫
  4. ALPF 知道已設定覆寫預先擷取參數。
  5. 另一個 GenericApp.exe 實例會以命令行預先擷取參數 2 啟動。 這個實例將會暫時性,因為主要進程已經存在。
  6. 由於此可執行檔已設定從 2 到 9 的覆寫,因此 ALPF 會強制此暫時性實例在案例 9 中啟動,而不是 2。
  7. ALPF 現在會針對案例 2 下的主要進程擷取適當的頁面,併為案例 9 下的其他進程擷取一組個別的頁面。
  8. 當應用程式的主要程式關閉時,將會移除覆寫,讓下一次啟動 GenericApp.exe 成為主要複本。
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;    
}

規格需求

需求
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限桌面應用程式]
標頭 processthreadsapi.h

另請參閱

PROCESS_INFORMATION_CLASS列舉GetProcessInformation 函式