THotPDF.RenderLoadedPagesParallelOrdered Method

Компилирует и отрисовывает загруженные страницы параллельно, выдавая готовые bitmap в порядке входа через ограниченный 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 выполняется последовательно в вызывающем потоке и получает позицию во входе (с нуля), запрошенный индекс страницы, заимствованный bitmap и флаг отмены

Bitmap действителен только на время callback и освобождается сразу после его возврата, поэтому если результат должен пережить вызов — копируйте или кодируйте его внутри callback

Установите Cancel, чтобы прекратить захват новых страниц, разбудить заблокированные workers, дождаться текущей работы, освободить неопубликованные результаты и вернуть число завершённых callback'ов

Отмена в callback также будит workers, ожидающие резервацию памяти, не превращая это внутреннее пробуждение в ошибку; внешний cancellation token или исключение в callback по-прежнему сообщают о сбое после очистки

Backpressure

OutputQueueDepth ограничивает число готовых bitmap, включая bitmap, активный в callback; значения меньше единицы выбирают фактическое число workers, а значения больше числа страниц обрезаются

Планировщик резервирует выходную ёмкость для следующей требуемой позиции входа, поэтому более поздние страницы не могут заполнить очередь и заблокировать упорядоченный прогресс, когда более ранняя страница компилируется медленнее

С включённым PeakMemorySchedulerEnabled запрошенный параллелизм уменьшается с учётом самой крупной оценки страницы и текущего доступного глобального бюджета, а каждая резервация страницы остаётся активной от захвата работы до выхода её заимствованного bitmap из callback

Резервации памяти запрашиваются в порядке входа до параллельной компиляции и отрисовки, поэтому более поздние страницы не могут забрать бюджет, нужный следующему callback

Поэтому находящийся в очереди вывод честно конкурирует с активной компиляцией и воспроизведением за один и тот же бюджет всего процесса, а при отмене или сбое неопубликованные резервации освобождаются до присоединения workers

Callback не должен изменять или уничтожать документ, пока workers активны

THPDFParallelRenderPipelineInfo · Display list и печатное производство