當機隔離的程式碼轉換工作執行緒
HotPDF 可以把高風險的 DCTDecode、JPXDecode 與 JBIG2Decode 影像解碼移出主控程序
隔離模式
cimAutomatic是預設值,並在主控執行檔旁可用時使用HotPDFCodecWorker.exe,否則保留相容的處理中(in-process)路徑cimRequired在工作執行緒遺失、無法啟動、當機、逾時、拒絕輸入或超過輸出上限時以失敗關閉cimDisabled一律使用現有的處理中解碼器
一旦可用的工作執行緒接受要求,cimAutomatic 就不會在主控程序中重試失敗或惡意的輸入
程序界限
每個解碼要求都在指派給單一程序 Windows Job Object 的全新隱藏程序中執行
- 當其控制代碼關閉時,Job Object 會終止工作執行緒與任何嘗試生成的後代
CodecWorkerMemoryLimitBytes套用每個程式的已認可記憶體上限,預設為 512 MiBCodecWorkerTimeoutMilliseconds預設為 10,000 ms,並終止掛起的工作執行緒- 編碼輸入、可選的 JBIG2 globals 與 BGR24 輸出使用單一隨機命名的共享記憶體對應,並帶有版本化的固定寬度通訊協定
- 已解碼輸出的容量受限於宣告的影像幾何與
DecodeBudgetBytes - 低解析度 JPEG 要求攜帶確切的目標維度,並傳回縮減 DCT 的幾何,而不建構全解析度的工作執行緒點陣
設定
PDF.CodecIsolationMode := cimRequired;
PDF.CodecWorkerExecutable :=
'C:\Program Files\MyApp\HotPDFCodecWorker.exe';
PDF.CodecWorkerTimeoutMilliseconds := 5000;
PDF.CodecWorkerMemoryLimitBytes := 256 * 1024 * 1024;
Bitmap := PDF.ExtractLoadedImage(0);
if Bitmap = nil then
begin
PDF.GetLastCodecWorkerInfo(Info);
Writeln(Ord(Info.Status), ': ', Info.ErrorMessage);
end;
空的 CodecWorkerExecutable 解析為目前應用程式旁的 HotPDFCodecWorker.exe
遙測
GetLastCodecWorkerInfo 回報狀態、程序識別碼、結束碼、經過的毫秒數與有界的主控端診斷
GetLastJPEGReducedDecodeInfo 在隔離的縮減 JPEG 要求之後回報來源、縮放、輸出與掃描線幾何
相異的狀態涵蓋不可用或無法啟動的工作執行緒、逾時、當機、解碼拒絕、通訊協定不符與已解碼輸出上限
建置與部署
build-HotPDF-Codec-Worker.cmd
建置命令在 tools\CodecWorker\<platform>\Release 下產生個別的 Win32 與 Win64 工作執行緒;部署與主控程序架構相符的工作執行緒