THotPDF.RenderLoadedPagesParallelOrdered Method

并发编译并渲染已加载的页面,同时通过有界的、位于调用线程上的回调,按输入顺序交付完成的位图

声明

function RenderLoadedPagesParallelOrdered(
    const PageIndices: array of Integer; DPI, MaxConcurrency,
    OutputQueueDepth: Integer; Callback: THPDFParallelRenderPageEvent): Integer; overload;

function RenderLoadedPagesParallelOrdered(
    const PageIndices: array of Integer; DPI, MaxConcurrency,
    OutputQueueDepth: Integer; Callback: THPDFParallelRenderPageEvent;
    out Info: THPDFParallelRenderPipelineInfo): Integer; overload;

回调与所有权

Callback 在调用线程上串行运行,接收从 0 开始的输入位置、请求的页面索引、借用的位图以及取消标志

位图仅在回调期间有效,回调返回后会立即释放;如果结果需要在该次调用之后继续使用,请在回调内复制或编码

设置 Cancel 会停止认领新页面、唤醒被阻塞的 worker、join 进行中的工作、释放未发布的结果,并返回已完成的回调次数

回调取消也会唤醒正在等待内存预留的 worker,但不会把这种内部唤醒当成错误;外部取消令牌或回调异常仍会在清理完成后报告失败

背压

OutputQueueDepth 限制已完成位图的数量,包括回调中正在处理的那一个;小于 1 的值会取有效的 worker 数,大于页面数的值会被钳位

调度器会为下一个需要的输入位置预留输出容量,因此即使较早的页面编译得更慢,后面的页面也不会占满队列而阻塞有序推进

启用 PeakMemorySchedulerEnabled 时,会根据最大的页面估算值和当前可用的全局预算降低请求的并行度,且每个页面的预留从被认领开始,一直持续到其借用的位图离开回调

内存预留按输入顺序在并行编译和渲染之前申请,因此后面的页面拿不走下一个回调所需的预算

因此排队的输出与活动中的编译和回放,公平地竞争同一个进程级预算;取消或失败时,会先释放未发布的预留,再 join worker

worker 处于活动状态期间,回调不得修改或销毁文档

THPDFParallelRenderPipelineInfo · 显示列表与印刷生产