THotPDF.RenderLoadedPagesParallelOrdered Method
로드된 페이지를 동시에 컴파일·렌더링하면서 완성된 비트맵은 제한된 호출 스레드 Callback으로 입력 순서대로 전달합니다
선언
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과 소유권
Callback은 호출 스레드에서 직렬로 실행되며 0부터 시작하는 입력 위치, 요청된 페이지 인덱스, 빌린 비트맵, 취소 플래그를 받습니다
비트맵은 Callback이 실행되는 동안에만 유효하고 Callback이 반환하자마자 해제되므로, 결과를 그 호출 이후에도 유지해야 한다면 Callback 안에서 복사하거나 인코딩해야 합니다
Cancel을 설정하면 새 페이지 claim을 중단하고 대기 중인 워커를 깨워 진행 중인 작업을 합류시키고, 공개되지 않은 결과를 해제한 뒤 완료된 Callback 개수를 반환합니다
Callback 취소는 메모리 예약을 기다리는 워커도 깨우지만 그 내부 깨움을 오류로 바꾸지는 않습니다. 외부 cancellation token이나 Callback 예외는 정리 후에도 여전히 실패로 보고합니다
백프레셔
OutputQueueDepth는 Callback에서 활성인 비트맵을 포함해 완성된 비트맵 수를 제한하고, 1 미만 값은 실효 워커 수를 선택하며 페이지 수를 넘는 값은 clamp됩니다
스케줄러는 다음에 필요한 입력 위치를 위해 출력 용량을 예약하므로, 앞선 페이지가 더 느리게 컴파일될 때 뒤늦은 페이지가 큐를 채워 순서대로 진행하지 못하게 하는 일이 없습니다
PeakMemorySchedulerEnabled 상태에서는 요청된 병렬도가 가장 큰 페이지 추정치와 현재 사용 가능한 전역 budget을 반영해 줄어들고, 모든 페이지 예약은 작업 claim부터 빌린 비트맵이 Callback을 떠날 때까지 활성 상태를 유지합니다
메모리 예약은 병렬 컴파일과 렌더링에 앞서 입력 순서대로 요청되므로, 뒤늦은 페이지가 다음 Callback에 필요한 budget을 가져가지 못합니다
따라서 큐에 쌓인 출력은 활성 컴파일 및 재생과 프로세스 전체 budget을 두고 공정하게 경쟁하며, 취소나 실패 시에는 워커를 합류시키기 전에 공개되지 않은 예약을 해제합니다
워커가 활동하는 동안 Callback은 문서를 변경하거나 파괴해서는 안 됩니다