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;
| Type | Description |
|---|---|
TPdfCancellationReason | Kullanı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 |
EPdfOperationCancelled | Tanılama için özgün Reason ve iletiyi koruyan iptal istisnası |
IPdfCancellationToken | IsCancelled yoklaması, RegisterCallback, ThrowIfCancelled ve istisna desteği sunan, uyumluluk amaçlı worker tarafı token |
IPdfCancellationTokenSource | Token ve idempotent Cancel sunan, uyumluluk amaçlı sahip tarafı kaynak |
IPdfCancellationRegistration | Id, 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 |
IPdfCancellationTokenSourceEx | Atomik TryCancel, CancelWithReason ve güçlü türlü TokenEx sunan genişletilmiş sahip kaynağı |
TPdfCancellationTokenSource | New, NewEx veya NewTimeout ile oluşturulan, iş parçacığı açısından güvenli kaynak uygulaması |
PdfNoCancellationToken | Hiçbir zaman iptal etmeyen ve iptal edilemez işler için kaynak ayırmayı önleyen paylaşımlı token |
| Type | Description |
|---|---|
TPdfFutureStatus | Sonuç durumu: pfsSuccess, pfsCancelled veya pfsFailure |
TPdfFutureDispatchMode | Yanı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 |
TPdfFutureOptions | Yanı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ı |
| Type | Description |
|---|---|
TPdfAsyncPriority | papLow ile papCritical arasındaki dört kuyruktan çıkış şeridi; her şerit içinde FIFO sırası |
TPdfAsyncTaskState | Görev yaşam döngüsü: patsQueued, patsRunning, patsSucceeded, patsCancelled veya patsFailed |
TPdfAsyncDispatchMode | padWorkerThread, padSynchronize veya yanıtı bastıran padNone üzerinden yanıt dağıtımı |
TPdfAsyncTaskWorker | Görevinin iptal token'ını alan method-pointer iş öğesi |
TPdfAsyncTaskReply | Değiştirilemez bir görev sonucu anlık görüntüsü alan method-pointer tamamlanma geri çağırması |
TPdfAsyncTaskResult | TaskId, State, Priority, QueuedAtTick, StartedAtTick ve CompletedAtTick zamanlaması, ErrorMessage ile ErrorClassName worker hata çifti, iletisiyle birlikte CancellationReason ve izole ReplyErrorMessage |
IPdfAsyncTask | Cancel, 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ı |
TPdfAsyncExecutorStats | Kapasite, 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ı |
EPdfAsyncQueueFull | Sınırlı bir kuyruk başka görev kabul edemediğinde Submit tarafından fırlatılır |
EPdfAsyncExecutorShutdown | Executor kapatması başladıktan sonra Submit tarafından fırlatılır |
TPdfAsyncExecutor | Sı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 |
| Function | Description |
|---|---|
PdfAsyncTick | Future ve executor üst verisinin kullandığı monotonik milisaniye tick değerini döndürür |
PdfAsyncTickDelta | Savunmacı 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 |
PdfNextAsyncId | Future'lar, geri çağırma kayıtları ve executor görevlerinin paylaştığı süreç yerel pozitif bir ID döndürür |
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;
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;
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
Ö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