PDFium Delphi Component Docs

FPdfAsync birimi

Unit: FPdfAsync
VCL, LCL, FMX ve headless uygulamalarda duyarlı PDF işleme için iptal, future ve sınırlı worker havuzu altyapısı

Syntax

TPdfCancellationReason = (pcrNone, pcrUser, pcrTimeout, pcrLinked,
  pcrShutdown, pcrSuperseded, pcrOther);

IPdfCancellationTokenEx = interface(IPdfCancellationToken)
  function RegisterCallbackManaged(const ACallback: TThreadMethod): IPdfCancellationRegistration;
  function WaitForCancellation(ATimeoutMs: Cardinal): Boolean;
  property Reason: TPdfCancellationReason read GetReason;
  property CancellationMessage: string read GetCancellationMessage;
  property CancelledAtTick: UInt64 read GetCancelledAtTick;
  property CallbackCount: Integer read GetCallbackCount;
  property HasCallbacks: Boolean read GetHasCallbacks;
end;

IPdfCancellationTokenSourceEx = interface(IPdfCancellationTokenSource)
  function TryCancel: Boolean;
  function CancelWithReason(AReason: TPdfCancellationReason; const AMessage: string): Boolean;
  property TokenEx: IPdfCancellationTokenEx read GetTokenEx;
end;

TPdfCancellationTokenSource = class
  destructor Destroy; override;
  class function New: IPdfCancellationTokenSource; static;
  class function NewEx: IPdfCancellationTokenSourceEx; static;
  class function NewTimeout(AMilliseconds: Cardinal; const AMessage: string = ''): IPdfCancellationTokenSourceEx; static;
end;

TPdfFutureOptions = record
  DispatchMode: TPdfFutureDispatchMode;
  ThreadPriority: TThreadPriority;
  class function Default: TPdfFutureOptions; static;
end;

TPdfFuture<T> = class
  class procedure Run(const AWorker: TPdfFutureWorker<T>; const AReply: TPdfFutureReply<T>; const AToken: IPdfCancellationToken = nil); static;
  class procedure RunEx(const AWorker: TPdfFutureWorker<T>; const AReply: TPdfFutureReply<T>; const AToken: IPdfCancellationToken; const AOptions: TPdfFutureOptions); static;
end;

TPdfAsyncExecutor = class
  constructor Create(AWorkerCount: Integer; AQueueCapacity: Integer = 0);
  destructor Destroy; override;
  function Submit(const AWorker: TPdfAsyncTaskWorker; const AReply: TPdfAsyncTaskReply = nil; APriority: TPdfAsyncPriority = papNormal; ADispatchMode: TPdfAsyncDispatchMode = padWorkerThread): IPdfAsyncTask;
  function TrySubmit(const AWorker: TPdfAsyncTaskWorker; const AReply: TPdfAsyncTaskReply; out ATask: IPdfAsyncTask; APriority: TPdfAsyncPriority = papNormal; ADispatchMode: TPdfAsyncDispatchMode = padWorkerThread): Boolean;
  function WaitForIdle(ATimeoutMs: Cardinal): Boolean;
  function GetStats: TPdfAsyncExecutorStats;
  procedure Shutdown(ACancelPending: Boolean = True);
  property WorkerCount: Integer read FWorkerCount;
  property QueueCapacity: Integer read FQueueCapacity;
  property IsShutdown: Boolean read GetIsShutdown;
end;

TPdfAsyncExecutorStats = record
  WorkerCount: Integer;
  QueueCapacity: Integer;
  QueuedCount: Integer;
  RunningCount: Integer;
  PeakQueuedCount: Integer;
  SubmittedCount: Int64;
  SucceededCount: Int64;
  CancelledCount: Int64;
  FailedCount: Int64;
  RejectedCount: Int64;
end;

IPdfAsyncTask = interface
  function Cancel: Boolean;
  function WaitFor(ATimeoutMs: Cardinal): Boolean;
  function Snapshot: TPdfAsyncTaskResult;
  property Id: Int64 read GetId;
  property State: TPdfAsyncTaskState read GetState;
  property Priority: TPdfAsyncPriority read GetPriority;
  property Token: IPdfCancellationToken read GetToken;
  property IsCompleted: Boolean read GetIsCompleted;
end;

Cancellation types

TypeDescription
TPdfCancellationReasonKullanıcı isteklerini, zaman aşımlarını, bağlı işleri, kapatmayı, geçersiz kılınan işleri ve uygulama tanımlı iptalleri kapsayan yapılandırılmış sonlandırma nedeni
EPdfOperationCancelledTanılama için özgün Reason ve iletiyi koruyan iptal istisnası
IPdfCancellationTokenIsCancelled yoklaması, RegisterCallback, ThrowIfCancelled ve istisna desteği sunan, uyumluluk amaçlı worker tarafı token
IPdfCancellationTokenSourceToken ve idempotent Cancel sunan, uyumluluk amaçlı sahip tarafı kaynak
IPdfCancellationRegistrationId, IsRegistered ve iş parçacığı açısından güvenli Unregister sunan kararlı geri çağırma kaydı
IPdfCancellationTokenExİptal üst verisi, geri çağırma sayaçları, kaldırılabilir geri çağırma kaydı ve olay tabanlı bekleme sunan genişletilmiş token
IPdfCancellationTokenSourceExAtomik TryCancel, CancelWithReason ve güçlü türlü TokenEx sunan genişletilmiş sahip kaynağı
TPdfCancellationTokenSourceNew, NewEx veya NewTimeout ile oluşturulan, iş parçacığı açısından güvenli kaynak uygulaması
PdfNoCancellationTokenHiçbir zaman iptal etmeyen ve iptal edilemez işler için kaynak ayırmayı önleyen paylaşımlı token

Future types

TypeDescription
TPdfFutureStatusSonuç durumu: pfsSuccess, pfsCancelled veya pfsFailure
TPdfFutureDispatchModeYanıt ilkesi: pfdSynchronize yanıtı ana iş parçacığına gönderir, pfdWorkerThread yanıtı worker üzerinde çağırır, pfdNone ise yanıtı bastırır
TPdfFutureOptionsYanıt dağıtımı ve worker ThreadPriority değerine ilişkin RunEx ayarları
TPdfFutureResult<T>Value ve HasValue, Status, ErrorMessage ile ErrorClassName çifti, CancellationReason, OperationId, StartedAtTick ve CompletedAtTick, durum yardımcıları ve ElapsedMilliseconds taşıyan tamamlanma zarfı
TPdfFutureWorker<T>Bir iptal token'ı alıp arka plan sonucunu döndüren method-pointer worker
TPdfFutureReply<T>Tamamlanmış TPdfFutureResult<T> değerini alan method-pointer geri çağırması
TPdfFutureThread<T>TPdfFuture<T> tarafından kullanılan derleyici destekli thread türü; Create ya da seçenek farkında olan CreateEx ile oluşturulur, uygulamalar normalde Run veya RunEx çağırır
TPdfFuture<T>Run üzerinden özgün eşitlenmiş yanıtlı davranışı koruyan ve RunEx ile yapılandırılabilir dağıtım ekleyen fire-and-forget yardımcısı

Executor types

TypeDescription
TPdfAsyncPrioritypapLow ile papCritical arasındaki dört kuyruktan çıkış şeridi; her şerit içinde FIFO sırası
TPdfAsyncTaskStateGörev yaşam döngüsü: patsQueued, patsRunning, patsSucceeded, patsCancelled veya patsFailed
TPdfAsyncDispatchModepadWorkerThread, padSynchronize veya yanıtı bastıran padNone üzerinden yanıt dağıtımı
TPdfAsyncTaskWorkerGörevinin iptal token'ını alan method-pointer iş öğesi
TPdfAsyncTaskReplyDeğiştirilemez bir görev sonucu anlık görüntüsü alan method-pointer tamamlanma geri çağırması
TPdfAsyncTaskResultTaskId, State, Priority, QueuedAtTick, StartedAtTick ve CompletedAtTick zamanlaması, ErrorMessage ile ErrorClassName worker hata çifti, iletisiyle birlikte CancellationReason ve izole ReplyErrorMessage
IPdfAsyncTaskCancel, zaman aşımı farkında WaitFor, atomik Snapshot ile Id, State, Priority, Token ve IsCompleted özelliklerini sunan gönderilmiş görev tanıtıcısı
TPdfAsyncExecutorStatsKapasite, anlık yük, en yüksek kuyruk derinliği ve birikimli gönderilen, başarılı, iptal edilen, başarısız ve reddedilen sayaçları
EPdfAsyncQueueFullSınırlı bir kuyruk başka görev kabul edemediğinde Submit tarafından fırlatılır
EPdfAsyncExecutorShutdownExecutor kapatması başladıktan sonra Submit tarafından fırlatılır
TPdfAsyncExecutorSınırlı kuyruk, dört O(1) öncelik halkası, işbirlikçi görev iptali, istatistikler ve kontrollü kapanış sunan, yeniden kullanılabilir sabit worker havuzu

Timing and identity helpers

FunctionDescription
PdfAsyncTickFuture ve executor üst verisinin kullandığı monotonik milisaniye tick değerini döndürür
PdfAsyncTickDeltaSavunmacı bir geçen milisaniye değeri hesaplar; eksik ya da ters sıralı tick değerleri için sıfır döndürür
PdfNextAsyncIdFuture'lar, geri çağırma kayıtları ve executor görevlerinin paylaştığı süreç yerel pozitif bir ID döndürür

Cancellation example

var
  CancelSource: IPdfCancellationTokenSourceEx;
begin
  CancelSource := TPdfCancellationTokenSource.NewTimeout(5000, 'Export deadline exceeded');
  TPdfFuture<Integer>.Run(Worker, Completed, CancelSource.TokenEx);
  if UserRequestedCancel then
    CancelSource.CancelWithReason(pcrUser, 'Export cancelled by user');
end;

Bounded executor example

var
  Executor: TPdfAsyncExecutor;
  Task: IPdfAsyncTask;
begin
  Executor := TPdfAsyncExecutor.Create(4, 128);
  try
    if not Executor.TrySubmit(RenderPage, PageCompleted, Task, papHigh, padSynchronize) then
      HandleBackpressure;
    Executor.WaitForIdle(30000);
  finally
    Executor.Free;
  end;
end;

Performance and threading

Delphi POSIX derlemeleri, kaynak uyumluluğu için TThreadPriority seçenek değerlerini (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest ve tpTimeCritical) korur, ancak platform RTL yalnızca varsayılan zamanlama yolunu destekler. tpNormal bu yolu kullanır; başka bir iş parçacığı önceliğiyle bir future oluşturmak bir worker başlatmadan önce ENotSupportedException fırlatır

Yinelenen ya da patlamalı işler için TPdfAsyncExecutor kullanın; böylece görevler her işlem için bir iş parçacığı oluşturmak yerine sabit bir iş parçacığı kümesini yeniden kullanır

Pozitif bir kuyruk kapasitesi belirleyici geri basınç sağlarken sıfır, kuyruğu sınırsız tutar; çalışan görevler kuyruk yuvası tüketmez

Öncelikli zamanlama şeritler arasında katıdır ve bir şerit içinde FIFO'dur; bu yüzden papCritical ve papHigh değerlerini gerçekten gecikmeye duyarlı işler için saklayın

WaitForIdle ana iş parçacığından çağrıldığında eşitlenmiş geri çağırmaları işler; böylece padSynchronize yanıtları bir kapanış kilitlenmesi olmadan tamamlanabilir

Her zaman aşımı kaynağı, iptal ya da süre dolmasına kadar tek bir hafif bekleme iş parçacığına sahiptir; bu yüzden çok sayıda kısa ömürlü son tarih oluştururken paylaşımlı bir uygulama zamanlayıcısı ya da deadline scheduler tercih edilmelidir

PDFium nesne sahipliği kuralları geçerliliğini korur: eşzamanlı her worker için bir TPdf örneği oluşturun ya da ayırın ve aynı etkin belge örneğini eşzamanlı olarak değiştirmeyin ya da işlemeyin

Compatibility

Özgün IPdfCancellationToken, IPdfCancellationTokenSource, TPdfCancellationTokenSource.New ve TPdfFuture<T>.Run API'leri kaynak uyumluluğunu korur

Genişletilmiş arayüzleri yalnızca yapılandırılmış tanılama, kaldırılabilir geri çağırmalar, zaman aşımı beklemesi ya da atomik iptal sahipliği gerektiğinde kullanın

Geri çağırmalar anonim methodlar yerine method pointer olarak kalır; böylece aynı API Delphi, C++Builder ve Free Pascal ile derlenir

See Also

TPdf.RenderPageProgressive, TPdfView.AsyncRendering