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 处于活动状态期间,回调不得修改或销毁文档