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 и печатное производство