Οι περισσότερες (Οι περισσότερες) (σ)σελίδες PDF ραστεροποιούνται (ραστεροποιούνται/rasterise) (σ)σε (σε) μερικά (μερικά) χιλιοστά του δευτερολέπτου (χιλιοστά του δευτερολέπτου) και (και) δεν το σκέφτεστε ποτέ (δεν το σκέφτεστε ποτέ). Στη συνέχεια, ένας χρήστης (Στη συνέχεια, ένας χρήστης) ανοίγει ένα αρχιτεκτονικό σχέδιο (ανοίγει ένα αρχιτεκτονικό σχέδιο) (A)A1 (A1), (μ)μια (μια) (σ)σελίδα (σελίδα) (γ)γεμάτη με δεκάδες (γεμάτη με δεκάδες) χιλιάδες (χιλιάδες) διανυσματικές πινελιές (διανυσματικές πινελιές/vector strokes), ή (ή) (έ)ένα (ένα) (π)πόστερ (πόστερ) συνωστισμένο με (συνωστισμένο με) (ο)ομάδες (ομάδες) διαφάνειας (διαφάνειας) (κ)και (και) απαλές μάσκες (απαλές μάσκες/soft masks), (κ)και η (και η) (μ)μία (μία) (κ)κλήση (κλήση) που τη ζωγραφίζει (που τη ζωγραφίζει) (π)παίρνει (παίρνει) δύο ή τρία δευτερόλεπτα (δύο ή τρία δευτερόλεπτα). Αν (Αν) (α)αυτή η κλήση τρέχει στο νήμα του UI (αυτή η κλήση τρέχει στο νήμα του UI), το παράθυρο σταματά (το παράθυρο σταματά) (ν)να (να) ξανασχεδιάζεται (ξανασχεδιάζεται/repainting), (η) η γραμμή (γραμμή) τίτλου (τίτλου) (γ)γίνεται γκρι (γίνεται γκρι/greys out), (κ)και το (και το) λειτουργικό (λειτουργικό) σύστημα (σύστημα) προτείνει να σκοτώσει (προτείνει να σκοτώσει) την εφαρμογή (την εφαρμογή). Η δουλειά (Η δουλειά) είναι (είναι) (ν)νόμιμη (νόμιμη). (Η) Η σελίδα (σελίδα) πραγματικά (πραγματικά) (χ)χρειάζεται όντως τόσο χρόνο (χρειάζεται όντως τόσο χρόνο). Το ελάττωμα είναι (Το ελάττωμα είναι) (ό)ότι η (ότι η) απόδοση είναι (απόδοση είναι) (μ)μια (μια) (α)αδιαίρετη (αδιαίρετη) (μ)μπλοκαρισμένη κλήση (μπλοκαρισμένη κλήση) (χ)χωρίς (χωρίς) κανέναν (κανέναν) τρόπο να βγει στην επιφάνεια για αέρα (τρόπο να βγει στην επιφάνεια για αέρα/come up for air) και (και) (κ)κανέναν τρόπο να σταματήσει (κανέναν τρόπο να σταματήσει)
Αυτό το άρθρο (Αυτό το άρθρο) (α)αφορά (αφορά) ακριβώς (ακριβώς) ένα (ένα) από αυτά τα (από αυτά τα) δύο (δύο) προβλήματα (προβλήματα): (τ)την (την) ακύρωση μιας μεγάλης (ακύρωση μιας μεγάλης) (α)απόδοσης μίας σελίδας (απόδοσης μίας σελίδας) (χ)χωρίς (χωρίς) (ν)να (να) παγώσει το (παγώσει το) (U)UI (UI). Ο χρήστης έκανε κλικ στην επόμενη (Ο χρήστης έκανε κλικ στην επόμενη) σελίδα (σελίδα), ή έκανε ζουμ (ή έκανε ζουμ), ή έκλεισε το (ή έκλεισε το) έγγραφο (έγγραφο), και η απόδοση (και η απόδοση) (σ)σε πτήση (σε πτήση/in flight) (ε)είναι (είναι) (τ)τώρα χαμένη δουλειά (τώρα χαμένη δουλειά) (π)που (που) (π)πρέπει (πρέπει) να τελειώσει στην επόμενη ευκαιρία (να τελειώσει στην επόμενη ευκαιρία) (α)αντί (αντί) να (να) τρέξει μέχρι (τρέξει μέχρι) την (την) ολοκλήρωση (ολοκλήρωση). Η εξομάλυνση (Η εξομάλυνση) της (της) (κ)κύλισης (κύλισης/scroll) και (και) του ζουμ (του ζουμ) (μ)με (με) την (την) προσωρινή αποθήκευση (προσωρινή αποθήκευση/caching) (α)αυτού (αυτού) που (που) είχε ήδη (είχε ήδη) ραστεροποιηθεί (ραστεροποιηθεί) (ε)είναι ένα ξεχωριστό ζήτημα (είναι ένα ξεχωριστό ζήτημα) (μ)με (με) (τ)το (το) δικό του σχέδιο (δικό του σχέδιο), (τ)το οποίο (το οποίο) καλύπτεται στο συνοδευτικό άρθρο που συνδέεται στο τέλος (καλύπτεται στο συνοδευτικό άρθρο που συνδέεται στο τέλος). Εδώ (Εδώ) η μόνη ερώτηση (η μόνη ερώτηση) είναι πώς (είναι πώς) να (να) (κ)κάνουμε (κάνουμε) (μ)μια (μια) (π)προοδευτική απόδοση (προοδευτική απόδοση) (ν)να (να) (α)απαντήσει σε ένα αίτημα (απαντήσει σε ένα αίτημα) ακύρωσης (ακύρωσης) (γ)γρήγορα (γρήγορα) (κ)και (και) καθαρά (καθαρά)
Το API (Το API) (π)προοδευτικής (προοδευτικής) (α)απόδοσης (απόδοσης) που (που) (τ)το PDFium παρέχει (παρέχει) ήδη (ήδη)
Το (Το) PDFium πρόβλεψε το (PDFium πρόβλεψε το) (μ)μισό (μισό) (π)πρόβλημα του παγώματος (πρόβλημα του παγώματος). (Δ)Δίπλα στην (Δίπλα στην) (ε)εφάπαξ (εφάπαξ/one-shot) FPDF_RenderPageBitmap, (ε)εκθέτει (εκθέτει) (μ)μια (μια) προοδευτική παραλλαγή (προοδευτική παραλλαγή) που χωρίζει (που χωρίζει) μια (μια) σελίδα σε (σελίδα σε) կομμάτια (κομμάτια) (ε)εργασίας (εργασίας). (Κ)Καλείτε (Καλείτε) την FPDF_RenderPageBitmap_Start μία φορά (μία φορά) (γ)για να (για να) ρυθμίσετε την απόδοση (ρυθμίσετε την απόδοση) (ε)έναντι ενός (έναντι ενός) bitmap προορισμού (bitmap προορισμού), (σ)στη (στη) (σ)συνέχεια (συνέχεια) καλείτε (καλείτε) (τ)την FPDF_RenderPage_Continue κατ' (κατ') (ε)επανάληψη (επανάληψη). Κάθε (Κάθε) Continue ραστεροποιεί (ραστεροποιεί) ένα οριοθετημένο κομμάτι (ένα οριοθετημένο κομμάτι/slice) (κ)και επιστρέφει (και επιστρέφει) μια κατάσταση (μια κατάσταση). Το FPDF_RENDER_TOBECONTINUED (σ)σημαίνει ότι υπάρχουν (σημαίνει ότι υπάρχουν) περισσότερα να γίνουν (περισσότερα να γίνουν), το FPDF_RENDER_DONE (σ)σημαίνει ότι (σημαίνει ότι) (η) η σελίδα ολοκληρώθηκε (σελίδα ολοκληρώθηκε), (κ)και το (και το) FPDF_RENDER_FAILED (σ)σημαίνει (σημαίνει) ότι (ότι) σταμάτησε σε ένα σφάλμα (σταμάτησε σε ένα σφάλμα). (Ό)Όταν ο (Όταν ο) (β)βρόχος (βρόχος) (τ)τελειώνει (τελειώνει) (κ)καλείτε (καλείτε) (τ)την FPDF_RenderPage_Close για (για) να απελευθερώσετε την (να απελευθερώσετε την) ανά σελίδα προοδευτική κατάσταση (ανά σελίδα προοδευτική κατάσταση). Επειδή ο (Επειδή ο) (έ)έλεγχος (έλεγχος) επιστρέφει στον (επιστρέφει στον) (κ)κώδικά (κώδικά) σας ανάμεσα (σας ανάμεσα) στα κομμάτια (στα κομμάτια/slices), (μ)μπορείτε να (μπορείτε να) αντλήσετε (αντλήσετε/pump) μηνύματα (μηνύματα), (ν)να (να) (ε)ενημερώσετε έναν δείκτη (ενημερώσετε έναν δείκτη) προόδου (προόδου), (ή) ή (ν)να ελέγξετε αν (να ελέγξετε αν) η (η) εργασία (εργασία) είναι (είναι) (α)ακόμα επιθυμητή (ακόμα επιθυμητή)
Ο μηχανισμός που (Ο μηχανισμός που) το PDFium παρέχει για την απόφαση του πότε να παραχωρήσει (PDFium παρέχει για την απόφαση του πότε να παραχωρήσει/yield) (ε)είναι μια (είναι μια) struct (struct/δομή) (c)callback με (callback με) (ό)όνομα (όνομα) IFSDK_PAUSE. Τη (Τη) δίνετε στην (δίνετε στην) Start και σε (και σε) (κ)κάθε Continue. Μετά από (Μετά από) (κ)κάθε (κάθε) κομμάτι (κομμάτι) (τ)το PDFium καλεί τον (το PDFium καλεί τον) (δ)δείκτη συνάρτησής του (δείκτη συνάρτησής του) NeedToPauseNow, και αν αυτό (και αν αυτό) (ε)επιστρέψει μια (επιστρέψει μια) (μ)μη μηδενική (μη μηδενική) (τ)τιμή (τιμή), η (η) τρέχουσα (τρέχουσα) Continue (σ)σταματάει (σταματάει) νωρίς (νωρίς) (κ)και (και) επιστρέφει τον έλεγχο πίσω με (επιστρέφει τον έλεγχο πίσω με) FPDF_RENDER_TOBECONTINUED. Η struct μεταφέρει επίσης (Η struct μεταφέρει επίσης) ένα πεδίο (ένα πεδίο) version, το (το) (ο)οποίο (οποίο) πρέπει να (πρέπει να) ρυθμιστεί σε (ρυθμιστεί σε) 1, (κ)και έναν (και έναν) (δ)δείκτη ελεύθερης μορφής (δείκτη ελεύθερης μορφής/free-form) user (π)που το (που το) PDFium (δ)δεν (δεν) (α)αγγίζει ποτέ και (αγγίζει ποτέ και) τον περνά ανέπαφο (τον περνά ανέπαφο). Αυτός ο ανέπαφος (Αυτός ο ανέπαφος) δείκτης είναι (δείκτης είναι) ολόκληρος ο (ολόκληρος ο) μεντεσές (μεντεσές/hinge) (τ)του (του) σχεδιασμού που (σχεδιασμού που) (α)ακολουθεί (ακολουθεί)
Επαναχρησιμοποίηση της (Επαναχρησιμοποίηση της) παύσης (παύσης) ως (ως) ακύρωση (ακύρωση)
Η (Η) αρχική πρόθεση της (αρχική πρόθεση της) NeedToPauseNow είναι (είναι) (ο τεμαχισμός χρόνου) (ο τεμαχισμός χρόνου/time-slicing) ο τεμαχισμός χρόνου (ο τεμαχισμός χρόνου). Επιστρέψτε (Επιστρέψτε) (μ)μη μηδενικό (μη μηδενικό) (ό)όταν ξοδευτεί (όταν ξοδευτεί) (ο) ο προϋπολογισμός του (προϋπολογισμός του) καρέ σας (καρέ σας/frame budget), επιστρέψτε (επιστρέψτε) 0 (0) (γ)για να (για να) (σ)συνεχίσετε την απόδοση (συνεχίσετε την απόδοση), (κ)και (και) (τ)το PDFium κάνει (το PDFium κάνει) παύση, (παύση,) (ώ)ώστε να (ώστε να) (μ)μπορείτε να (μπορείτε να) κάνετε κάτι (κάνετε κάτι) άλλο πριν συνεχίσετε (άλλο πριν συνεχίσετε) την (την) (ί)ίδια απόδοση (ίδια απόδοση). Το (Το) PDFium Component (PDFium Component) επαναχρησιμοποιεί αυτό το (επαναχρησιμοποιεί αυτό το) (ί)ίδιο σήμα (ίδιο σήμα) για ένα διαφορετικό ρήμα (για ένα διαφορετικό ρήμα). Αντί να απαντά (Αντί να απαντά) (")"πρέπει να (πρέπει να) (κ)κάνω παύση και να σας αφήσω να συνεχίσετε," η (" η) (c)callback απαντά (callback απαντά) (")"έχει (έχει) (α)ακυρωθεί (ακυρωθεί) (α)αυτή η εργασία (αυτή η εργασία)." Τα (." Τα) δύο αυτά αντιστοιχίζονται (δύο αυτά αντιστοιχίζονται) καθαρά το ένα πάνω στο άλλο (καθαρά το ένα πάνω στο άλλο) (ε)εξαιτίας του (εξαιτίας του) (τ)τι κάνει (τι κάνει) (ο) ο βρόχος (βρόχος) όταν βλέπει (όταν βλέπει) (τ)τη σημαία (τη σημαία). Μια (Μια) (γ)γνήσια (γνήσια) (π)παύση (παύση) (α)αναμένει (αναμένει) (μ)μια αργότερη (μια αργότερη) Continue· (·) μια ακύρωση (μια ακύρωση) (ό)όχι (όχι). Μόλις (Μόλις) ο βρόχος κλήσης παρατηρήσει ότι το διακριτικό ακυρώθηκε (ο βρόχος κλήσης παρατηρήσει ότι το διακριτικό ακυρώθηκε/token is cancelled), κλείνει το πλαίσιο (κλείνει το πλαίσιο) απόδοσης (απόδοσης) και δεν καλεί (και δεν καλεί) ποτέ (ποτέ) ξανά την Continue (ξανά την), οπότε (οπότε) η ίδια μη μηδενική (η ίδια μη μηδενική) επιστροφή που (επιστροφή που) (τ)το PDFium διαβάζει ως (το PDFium διαβάζει ως) (")"σταμάτα αυτό το κομμάτι" γίνεται, στην (" γίνεται, στην) ουσία, (ουσία,) (")"σταμάτα για πάντα ("σταμάτα για πάντα)."
Η ακύρωση (Η ακύρωση) (ε)εκφράζεται (εκφράζεται) (μ)μέσω (μέσω) (μ)μιας διεπαφής (μιας διεπαφής/interface), (τ)της IPdfCancellationToken, της οποίας η ιδιότητα (της οποίας η ιδιότητα) IsCancelled γυρίζει από false (γυρίζει από false) (σ)σε true όταν (σε true όταν) κάποιο (κάποιο) (ά)άλλο μέρος του (άλλο μέρος του) (π)προγράμματος (προγράμματος) ζητήσει να σταματήσει η (ζητήσει να σταματήσει η) απόδοση (απόδοση). (Η) Η γέφυρα ανάμεσα (γέφυρα ανάμεσα) (σ)σε (σε) (α)αυτήν τη (αυτήν τη) (δ)διεπαφή Pascal (διεπαφή Pascal) (κ)και την (και την) (C) C (c)callback του (callback του) (P)PDFium είναι (PDFium είναι) (έ)ένας (ένας) (μ)μοναδικός δείκτης (μοναδικός δείκτης). (Η) Η αναφορά διεπαφής (αναφορά διεπαφής) του διακριτικού (του διακριτικού) (γ)γράφεται στο (γράφεται στο) IFSDK_PAUSE.user, (κ)και μια στατική (και μια στατική) (c)callback cdecl τη διαβάζει ξανά πίσω και (τη διαβάζει ξανά πίσω και) την (την) ερωτά (ερωτά/queries). Αυτό (Αυτό) (ε)είναι το (είναι το) (κ)κλασικό πρόβλημα (κλασικό πρόβλημα) του (του) (ν)να αφήνεις (να αφήνεις) (μ)μια βιβλιοθήκη (μια βιβλιοθήκη) (C) C (ν)να καλεί πίσω σε (να καλεί πίσω σε) (P)Pascal: η (Pascal: η) (c)callback (c)πρέπει να (πρέπει να) (ε)είναι μια απλή συνάρτηση (είναι μια απλή συνάρτηση) (μ)με σύμβαση κλήσης (με σύμβαση κλήσης) (C) C, όχι (όχι) (μ)μέθοδος, επειδή το (μέθοδος, επειδή το) (P)PDFium (α)αποθηκεύει και καλεί (αποθηκεύει και καλεί) (έ)έναν (έναν) γυμνό δείκτη συνάρτησης που δεν (γυμνό δείκτη συνάρτησης που δεν) ξέρει τίποτα για αντικείμενα (ξέρει τίποτα για αντικείμενα) (P)Pascal ή για το Self (Pascal ή για το)
type
TPdfProgressivePause = record
Pause: IFSDK_PAUSE; // Το PDFium διαβάζει αυτό; το .user κρατά το διακριτικό (token)
Token: IPdfCancellationToken; // Η ισχυρή (strong) αναφορά κρατά το διακριτικό ζωντανό (alive)
end;
function ProgressivePauseCallback(pThis: PIFSDK_PAUSE): FPDF_BOOL; cdecl;
var
Token: IPdfCancellationToken;
begin
Result := 0;
if (pThis = nil) or (pThis^.user = nil) then
Exit;
Token := IPdfCancellationToken(pThis^.user);
if Token.IsCancelled then
Result := 1; // μη μηδενικό (non-zero): Το PDFium σταματά αυτό το κομμάτι (chunk)
end;
Η (Η) (c)callback ανακτά (ανακτά) (τ)το διακριτικό (το διακριτικό) (κ)κάνοντας (κάνοντας) (c)cast το (cast το) pThis^.user (π)πίσω στον (πίσω στον) τύπο διεπαφής και (τύπο διεπαφής και) (δ)διαβάζει το (διαβάζει το) IsCancelled. Τίποτα (Τίποτα) (σ)σε (σε) (α)αυτήν (αυτήν) (δ)δεν δεσμεύει (δεν δεσμεύει/allocates), δεν κλειδώνει (δεν κλειδώνει/locks), ή δεν μπλοκάρει (ή δεν μπλοκάρει/blocks), (τ)το οποίο έχει (το οποίο έχει) (σ)σημασία επειδή το (σημασία επειδή το) PDFium την καλεί στο (PDFium την καλεί στο) νήμα απόδοσης μετά από κάθε κομμάτι (νήμα απόδοσης μετά από κάθε κομμάτι) και οποιαδήποτε εργασία (και οποιαδήποτε εργασία) (γ)γίνεται εδώ προστίθεται στο (γίνεται εδώ προστίθεται στο) (κ)κόστος (κόστος) της ίδιας της απόδοσης (της ίδιας της απόδοσης). (Η) Η προστασία έναντι μιας (προστασία έναντι μιας) nil struct ή ενός (ή ενός) nil πεδίου user (σ)σημαίνει ότι η (σημαίνει ότι η) ίδια συνάρτηση είναι (ίδια συνάρτηση είναι) ασφαλής (ασφαλής) (γ)για (για) εγκατάσταση (εγκατάσταση) (α)ακόμα (ακόμα) (κ)και σε μια (και σε μια) απόδοση στην (απόδοση στην) οποία (οποία) (δ)δεν δόθηκε ποτέ (δεν δόθηκε ποτέ) ένα (ένα) πραγματικό (πραγματικό) (δ)διακριτικό (διακριτικό)
Κρατώντας (Κρατώντας) το διακριτικό ζωντανό σε ολόκληρο (το διακριτικό ζωντανό σε ολόκληρο) το (το) βρόχο (βρόχο)
Το (Το) (c)casting (c)ενός δείκτη διεπαφής (ενός δείκτη διεπαφής) (μ)μέσω (μέσω) ενός ακατέργαστου (ενός ακατέργαστου/raw) Pointer (κ)και (και) πίσω είναι (πίσω είναι) εκεί (εκεί) όπου (όπου) (γ)γεννιούνται (γεννιούνται) τα σφάλματα διάρκειας ζωής (τα σφάλματα διάρκειας ζωής/lifetime bugs). Ένα (Ένα) IInterface στο (στο) (D)Delphi έχει (έχει) (μ)μετρητή (μετρητή) (α)αναφορών (αναφορών), και ο (και ο) μετρητής κινείται (μετρητής κινείται) μόνο (μόνο) (ό)όταν (όταν) ο (ο) μεταγλωττιστής (μεταγλωττιστής/compiler) (μ)μπορεί (μπορεί) (ν)να δει (να δει) μια (μια) (μ)μεταβλητή (μεταβλητή) τύπου διεπαφής να εκχωρείται (τύπου διεπαφής να εκχωρείται). (Η) Η αποθήκευση του διακριτικού αποκλειστικά (αποθήκευση του διακριτικού αποκλειστικά) (ω)ως ενός (ως ενός) γυμνού (γυμνού) (δ)δείκτη (δείκτη) (μ)μέσα (μέσα) στο IFSDK_PAUSE.user (θ)θα το (θα το) έκρυβε (έκρυβε) από τον (από τον) μετρητή αναφορών εντελώς (μετρητή αναφορών εντελώς). (Α)Αν (Αν) η μόνη άλλη αναφορά σε (η μόνη άλλη αναφορά σε) αυτό το διακριτικό (αυτό το διακριτικό) (έ)έβγαινε εκτός εμβέλειας (έβγαινε εκτός εμβέλειας) (ε)ενώ ο βρόχος Continue ήταν (ενώ ο βρόχος) (ήταν) ακόμα (ακόμα) σε (σε) (ε)εκτέλεση (εκτέλεση), το (το) αντικείμενο θα απελευθερωνόταν κάτω από (αντικείμενο θα απελευθερωνόταν κάτω από) την (την) (c)callback (c) (κ)και (και) το (το) (ε)επόμενο (επόμενο) κομμάτι θα προσπελάσει (κομμάτι θα προσπελάσει) (έ)έναν (έναν) κρεμάμενο δείκτη (κρεμάμενο δείκτη/dangling pointer)
Αυτός (Αυτός) είναι ο (είναι ο) λόγος για τον οποίο ο περιγραφέας (λόγος για τον οποίο ο περιγραφέας/descriptor) (ε)είναι μια (είναι μια) εγγραφή (εγγραφή/record) (π)που κρατάει (που κρατάει) δύο (δύο) (π)πράγματα (πράγματα), όχι (όχι) ένα (ένα). Το (Το) (π)πεδίο (πεδίο) Pause είναι η struct που (είναι η struct που) διαβάζει το (διαβάζει το) PDFium. Το (Το) (π)πεδίο (πεδίο) Token είναι μια (είναι μια) πραγματική αναφορά τύπου διεπαφής που ο μεταγλωττιστής (πραγματική αναφορά τύπου διεπαφής που ο μεταγλωττιστής) μετράει (μετράει), και υπάρχει χωρίς (και υπάρχει χωρίς) (κ)κανέναν (κανέναν) (ά)άλλο (άλλο) λόγο από (λόγο από) (τ)το (το) να καρφιτσώσει το διακριτικό στη μνήμη (να καρφιτσώσει το διακριτικό στη μνήμη) για (για) όσο ζει (όσο ζει) η (η) (εγ)εγγραφή (εγγραφή). Η εγγραφή (Η εγγραφή) (ε)είναι (είναι) (μ)μια τοπική (μια τοπική) (μ)μεταβλητή (μεταβλητή) στη στοίβα της (στη στοίβα της) ρουτίνας (ρουτίνας) απόδοσης (απόδοσης), (ο)οπότε (οπότε) παραμένει έγκυρη (παραμένει έγκυρη) για (για) ολόκληρη (ολόκληρη) (τ)τη διάρκεια του (τη διάρκεια του) (β)βρόχου (βρόχου) και (και) (κ)καταστρέφεται (καταστρέφεται/torn down) (μ)μόνο (μόνο) (ό)όταν βγει η ρουτίνα (όταν βγει η ρουτίνα). Ο (Ο) γυμνός (γυμνός) (δ)δείκτης (δείκτης) (σ)στο (στο) user και η (και η) μετρημένη (μετρημένη) αναφορά στο (αναφορά στο) Token κατονομάζουν το ίδιο αντικείμενο (κατονομάζουν το ίδιο αντικείμενο)· το ένα (το ένα) (ε)είναι (είναι) αυτό που (αυτό που) (τ)το PDFium μπορεί να (το PDFium μπορεί να) (δ)διαβάσει (διαβάσει), το (το) (ά)άλλο (άλλο) είναι αυτό που εμποδίζει (είναι αυτό που εμποδίζει) (τ)το (το) αντικείμενο (αντικείμενο) (απ)από το να (από το να) (σ)συλλεχθεί (συλλεχθεί/collected)
var
Pause: TPdfProgressivePause;
EffectiveToken: IPdfCancellationToken;
begin
// ... επιλέξτε EffectiveToken ...
// Ισχυρή (Strong) αναφορά πρώτα, μετά δημοσιεύστε το ίδιο αντικείμενο στο PDFium μέσω του .user.
Pause.Token := EffectiveToken;
Pause.Pause.version := 1;
Pause.Pause.NeedToPauseNow := ProgressivePauseCallback;
Pause.Pause.user := Pointer(EffectiveToken);
(Κ)Κλείσιμο (Κλείσιμο) του (του) πλαισίου (πλαισίου) (α)απόδοσης ανεξάρτητα από το (απόδοσης ανεξάρτητα από το) (π)πώς τελειώνει ο (πώς τελειώνει ο) (β)βρόχος (βρόχος)
Κάθε κλήση στην FPDF_RenderPageBitmap_Start (Κάθε κλήση στην) (δ)δεσμεύει προοδευτική κατάσταση που το PDFium (δεσμεύει προοδευτική κατάσταση που το PDFium) (σ)συσχετίζει με (συσχετίζει με) (τ)τη (τη) σελίδα (σελίδα), και αυτή (και αυτή) (η) η κατάσταση απελευθερώνεται (κατάσταση απελευθερώνεται) μόνο από την (μόνο από την) FPDF_RenderPage_Close. (Υ)Υπάρχουν τρεις διέξοδοι από τον (Υπάρχουν τρεις διέξοδοι από τον) βρόχο (βρόχο) (ο)οδήγησης (οδήγησης/drive loop). Η (Η) σελίδα τελειώνει (σελίδα τελειώνει) και η (και η) (τ)τελευταία (τελευταία) (κ)κατάσταση (κατάσταση) (ε)είναι (είναι) FPDF_RENDER_DONE. Το διακριτικό ενεργοποιείται (Το διακριτικό ενεργοποιείται/trips) και (και) ο βρόχος εξέρχεται (ο βρόχος εξέρχεται) (ν)νωρίς αναφέροντας ακύρωση (νωρίς αναφέροντας ακύρωση). Κάτι (Κάτι) αποτυγχάνει (αποτυγχάνει) και η (και η) (κ)κατάσταση είναι (κατάσταση είναι) FPDF_RENDER_FAILED. (Κ)Και (Και) (ο)οι (οι) τρεις πρέπει (τρεις πρέπει) να (να) καλέσουν Close, και (και) η (η) (δ)διαδρομή ακύρωσης (διαδρομή ακύρωσης) (ε)είναι (είναι) η πιο (η πιο) (ε)εύκολη να γίνει (εύκολη να γίνει) λάθος (λάθος), (ε)επειδή (επειδή) (τ)το φυσικό (το φυσικό) σχήμα (σχήμα) (τ)του (του) (")"βλέπω (βλέπω) (α)ακύρωση, σπάω (ακύρωση, σπάω)" (τ)τείνει (τείνει) να (να) παραλείπει τον καθαρισμό (παραλείπει τον καθαρισμό) (σ)στο δρόμο του για την (στο δρόμο του για την) (έ)έξοδο (έξοδο). (Η) Η παράλειψη της Close διαρρέει (διαρρέει) την (την) ανά σελίδα κατάσταση (ανά σελίδα κατάσταση), (κ)και ένα (και ένα) viewer (viewer) (π)που αφήνει τον χρήστη να (που αφήνει τον χρήστη να) (α)ακυρώνει (ακυρώνει) τη μια απόδοση μετά (τη μια απόδοση μετά) (τ)την άλλη (την άλλη) θα συσσώρευε αυτή (θα συσσώρευε αυτή) (τ)τη διαρροή (τη διαρροή) σε (σε) (κ)κάθε σελίδα που ματαιώθηκε (κάθε σελίδα που ματαιώθηκε)
Το στιβαρό (Το στιβαρό) (σ)σχήμα βάζει τον βρόχο (σχήμα βάζει τον βρόχο) και την ταξινόμηση (και την ταξινόμηση) (τ)του αποτελέσματος μέσα σε (του αποτελέσματος μέσα σε) ένα try (ένα) και (και) (τ)την (την) FPDF_RenderPage_Close (σ)στο αντίστοιχο (στο αντίστοιχο) finally. Το (Το) (b)bitmap προορισμού καταστρέφεται στο (προορισμού καταστρέφεται στο) ίδιο μπλοκ (ίδιο μπλοκ). (Η) Η ακύρωση μπορεί να (ακύρωση μπορεί να) βγει από τον (βγει από τον) (β)βρόχο μέσα από (βρόχο μέσα από) μια πρόωρη (μια πρόωρη) Exit και το finally (και το) τρέχει (τρέχει) (α)ακόμα (ακόμα), (ο)οπότε υπάρχει (οπότε υπάρχει) (α)ακριβώς (ακριβώς) ένα (ένα) (μ)μέρος (μέρος) (π)που (που) (απ)απελευθερώνει (απελευθερώνει) την προοδευτική κατάσταση (την προοδευτική κατάσταση) (κ)και δεν (και δεν) (μ)μπορεί (μπορεί) (ν)να παρακαμφθεί (να παρακαμφθεί)
Status := FPDF_RenderPageBitmap_Start(PdfBmp, FPage, Left, Top,
Width, Height, Ord(Rotation), EncodeRenderOptions(Options), Pause.Pause);
try
while Status = FPDF_RENDER_TOBECONTINUED do
begin
if EffectiveToken.IsCancelled then
begin
Result := prsCancelled;
Exit;
end;
Status := FPDF_RenderPage_Continue(FPage, Pause.Pause);
end;
if EffectiveToken.IsCancelled then
Result := prsCancelled
else if Status = FPDF_RENDER_DONE then
Result := prsDone
else
Result := prsFailed;
finally
// Απελευθερώνει την προοδευτική κατάσταση που δεσμεύτηκε από τη Start; υποχρεωτικό (mandatory) σε κάθε διαδρομή.
FPDF_RenderPage_Close(FPage);
FPDFBitmap_Destroy(PdfBmp);
end;
Ο βρόχος ελέγχει (Ο βρόχος ελέγχει) (τ)το (το) διακριτικό (διακριτικό) (π)πριν (πριν) (απ)από (από) (κ)κάθε Continue καθώς και (καθώς και) στηριζόμενος στην (στηριζόμενος στην) (c)callback (c)μέσα (μέσα) σε (σε) (α)αυτήν (αυτήν). (Η) Η (c)callback συντομεύει (συντομεύει) (τ)το (το) (τ)τρέχον κομμάτι (τρέχον κομμάτι)· (·) (ο) ο έλεγχος (έλεγχος) του βρόχου (του βρόχου) (σ)σταματά το (σταματά το) επόμενο από το να ξεκινήσει (επόμενο από το να ξεκινήσει). (Μα)Μαζί (Μαζί) περιορίζουν το πόσο (περιορίζουν το πόσο) χρόνο παίρνει μια ακύρωση (χρόνο παίρνει μια ακύρωση) για να τεθεί σε ισχύ (για να τεθεί σε ισχύ) (σ)σε (σε) περίπου τη διάρκεια (περίπου τη διάρκεια) (ε)ενός κομματιού (ενός κομματιού)
Τρεις (Τρεις) (ε)εκβάσεις (εκβάσεις), (κ)και τι (και τι) περιέχει (περιέχει) το (το) bitmap μετά (μετά) (απ)από μια ακύρωση (από μια ακύρωση)
Το (Το) δημόσιο σημείο (δημόσιο σημείο) (ε)εισόδου (εισόδου) είναι (είναι) η TPdf.RenderPageProgressive, και (και) επιστρέφει ένα (επιστρέφει ένα) TPdfProgressiveStatus το οποίο (το οποίο) είναι (είναι) ένα (ένα) από (από) (τ)τα (τα) prsDone, prsCancelled, (ή) ή (ή) prsFailed. (Ο)Οι τιμές αντικατοπτρίζουν τις σταθερές (τιμές αντικατοπτρίζουν τις σταθερές) FPDF_RENDER_* του (του) PDFium (σ)σε (σε) ιδιωματισμό (ιδιωματισμό) (P)Pascal αλλά διπλώνουν την (αλλά διπλώνουν την) (π)περίπτωση ακύρωσης ως (περίπτωση ακύρωσης ως) αποτέλεσμα πρώτης κατηγορίας (αποτέλεσμα πρώτης κατηγορίας/first-class result) αντί για σφάλμα (αντί για σφάλμα)
Το σημείο (Το σημείο) (π)που πιάνει τους ανθρώπους αδιάβαστους είναι το τι (που πιάνει τους ανθρώπους αδιάβαστους είναι το τι) (π)περιέχει (περιέχει) το (το) bitmap προορισμού (προορισμού) μετά από prsCancelled. (Δ)Δεν (Δεν) (ε)είναι (είναι) (κ)κενό (κενό). (Τ)Το PDFium (PDFium) (α)αποδίδει προοδευτικά στο ίδιο (αποδίδει προοδευτικά στο ίδιο) (b)bitmap κομμάτι προς κομμάτι (κομμάτι προς κομμάτι), οπότε (οπότε) (ό)όταν μια ακύρωση σταματά (όταν μια ακύρωση σταματά) (τ)τον βρόχο (τον βρόχο), (τ)το (το) bitmap κρατάει ό,τι (κρατάει ό,τι) είχε ζωγραφιστεί μέχρι εκείνη τη στιγμή (είχε ζωγραφιστεί μέχρι εκείνη τη στιγμή), το οποίο (το οποίο) (ε)είναι (είναι) (μ)μια μερική εικόνα (μια μερική εικόνα/partial image): (κ)κάποιες (κάποιες) ζώνες τελείωσαν (ζώνες τελείωσαν), (τ)οι (οι) (υ)υπόλοιπες (υπόλοιπες) δείχνουν ακόμα το (δείχνουν ακόμα το) (χ)χρώμα γεμίσματος (χρώμα γεμίσματος/fill colour). Το (Το) (α)αν αυτό το μερικό (αν αυτό το μερικό) αποτέλεσμα (αποτέλεσμα) (ε)είναι (είναι) (χ)χρήσιμο εξαρτάται (χρήσιμο εξαρτάται) (απ)από (από) τον καλούντα (τον καλούντα). Ένα viewer (Ένα viewer) που πρόκειται να (που πρόκειται να) (π)πετάξει το (πετάξει το) bitmap επειδή (επειδή) (ο) ο χρήστης πλοηγήθηκε αλλού (χρήστης πλοηγήθηκε αλλού) (μ)μπορεί (μπορεί) (α)απλά (απλά) (ν)να το (να το) (α)αγνοήσει (αγνοήσει). Ένα (Ένα) viewer που (που) θέλει να δείξει (θέλει να δείξει) (μ)μια (μια) (π)προεπισκόπηση χαμηλού (προεπισκόπηση χαμηλού) (κ)κόστους (κόστους) μπορεί (μπορεί) (ν)να το κρατήσει (να το κρατήσει). Αυτό που (Αυτό που) δεν (δεν) (π)πρέπει (πρέπει) (ν)να (να) κάνετε είναι (κάνετε είναι) να (να) (υ)υποθέσετε (υποθέσετε) ότι το (ότι το) prsCancelled (υ)υποδηλώνει ένα κενό ή (υποδηλώνει ένα κενό ή) μη (μη) καθορισμένο (καθορισμένο) bitmap· (υ)υποδηλώνει ένα ειλικρινές (υποδηλώνει ένα ειλικρινές) (σ)στιγμιότυπο μιας (στιγμιότυπο μιας) ανολοκλήρωτης απόδοσης (ανολοκλήρωτης απόδοσης)
var
Bmp: TBitmap;
Token: IPdfCancellationToken;
Status: TPdfProgressiveStatus;
begin
Bmp := TBitmap.Create;
try
// Το Token ξεκινά (starts) μη ακυρωμένο (un-cancelled); γυρίστε το Token.IsCancelled από αλλού
// (μια ενέργεια UI, ένα συμβάν πλοήγησης) για να ματαιώσετε την απόδοση σε πτήση (in flight).
Status := Pdf.RenderPageProgressive(Bmp, 0, 0, PageW, PageH, Token);
case Status of
prsDone: Image1.Picture.Assign(Bmp); // αποδόθηκε πλήρως (fully rendered)
prsCancelled: ; // μερικό (partial) bitmap, συνήθως απορρίπτεται
prsFailed: ShowMessage('Render failed');
end;
finally
Bmp.Free;
end;
end;
Το μηδενικό (Το μηδενικό/nil) διακριτικό και μια διαδρομή callback (διακριτικό και μια διαδρομή callback) (χ)χωρίς (χωρίς) διακλαδώσεις (διακλαδώσεις/branch-free)
Η ακύρωση είναι προαιρετική (Η ακύρωση είναι προαιρετική/opt-in). Ένας καλών που απλώς (Ένας καλών που απλώς) θέλει (θέλει) προοδευτική απόδοση για (προοδευτική απόδοση για) το όφελος της άντλησης μηνυμάτων (το όφελος της άντλησης μηνυμάτων), χωρίς καμία (χωρίς καμία) (π)πρόθεση ακύρωσης (πρόθεση ακύρωσης), (θ)θα πρέπει να (θα πρέπει να) μπορεί (μπορεί) να περάσει (να περάσει) nil για το (για το) διακριτικό (διακριτικό). Ο (Ο) αδόκιμος (αδόκιμος/naive) (τ)τρόπος (τρόπος) να υποστηριχθεί (να υποστηριχθεί) αυτό (αυτό) (ε)είναι να (είναι να) (σ)σκορπίσετε (σκορπίσετε) "αν (αν) δόθηκε (δόθηκε) (δ)διακριτικό" ελέγχους (" ελέγχους) σε όλη (σε όλη) (τ)την (την) (c)callback (c)και τον (και τον) βρόχο, το (βρόχο, το) οποίο σημαίνει μια (οποίο σημαίνει μια) διακλάδωση (διακλάδωση/branch) (σ)σε (σε) κάθε κομμάτι και μια (κάθε κομμάτι και μια) callback που (που) πρέπει να (πρέπει να) χειριστεί τόσο (χειριστεί τόσο) ένα πραγματικό διακριτικό όσο (ένα πραγματικό διακριτικό όσο) και (και) (τ)την απουσία του (την απουσία του)
Η υλοποίηση αποφεύγει αυτό (Η υλοποίηση αποφεύγει αυτό) (α)αντικαθιστώντας ένα (αντικαθιστώντας ένα) singleton (singleton) (ό)όταν (όταν) ο καλών (ο καλών) (δ)δεν (δεν) (π)περνά (περνά) τίποτα (τίποτα). Ένα (Ένα) διακριτικό nil ανταλλάσσεται για το PdfNoCancellationToken, (α)μια διεπαφή (μια διεπαφή) της οποίας (της οποίας) το (το) IsCancelled είναι πάντα false (είναι πάντα false). Από (Από) αυτό το (αυτό το) σημείο (σημείο) (η) η callback (callback) (κ)και ο βρόχος (και ο βρόχος) (έ)έχουν ένα διακριτικό (έχουν ένα διακριτικό) να ρωτήσουν (να ρωτήσουν) (σ)σε (σε) κάθε περίπτωση (κάθε περίπτωση), (ο)οπότε (οπότε) ούτε ο ένας ούτε ο (ούτε ο ένας ούτε ο) (ά)άλλος χρειάζεται έναν έλεγχο για (άλλος χρειάζεται έναν έλεγχο για) nil (nil) και (και) ούτε ο ένας ούτε ο (ούτε ο ένας ούτε ο) (ά)άλλος (άλλος) χρειάζεται (χρειάζεται) (μ)μια ειδική διαδρομή (μια ειδική διαδρομή). (Τ)Το (Το) (δ)διακριτικό ποτέ-μην-ακυρώνεις (διακριτικό ποτέ-μην-ακυρώνεις/never-cancel) (α)απλά απαντά πάντα false (απλά απαντά πάντα false), η callback επιστρέφει (η callback επιστρέφει) (π)πάντα μηδέν (πάντα μηδέν), (κ)και (και) η (η) απόδοση τρέχει μέχρι (απόδοση τρέχει μέχρι) την (την) ολοκλήρωση ακριβώς όπως (ολοκλήρωση ακριβώς όπως) θα έκανε (θα έκανε) (μ)μια (μια) μη ακυρώσιμη (μη ακυρώσιμη). (Η) Η προαιρετική συμπεριφορά (προαιρετική συμπεριφορά) (μ)μοντελοποιείται ως ένα διακριτικό (μοντελοποιείται ως ένα διακριτικό) (π)που δεν ενεργοποιείται ποτέ (που δεν ενεργοποιείται ποτέ) αντί για την απουσία ενός διακριτικού (αντί για την απουσία ενός διακριτικού), πράγμα που κρατά (πράγμα που κρατά) (τ)τη γρήγορη (τη γρήγορη) (δ)διαδρομή ομοιόμορφη (διαδρομή ομοιόμορφη/hot path uniform)
// nil -> never-cancel singleton, οπότε η διαδρομή (path) της callback είναι πανομοιότυπη (identical)
// είτε ο καλών (caller) επέλεξε (opted into) ακύρωση (cancellation) είτε όχι.
if AToken <> nil then
EffectiveToken := AToken
else
EffectiveToken := PdfNoCancellationToken;
Το σχήμα (Το σχήμα) (π)που αναδύεται είναι μικρό (που αναδύεται είναι μικρό) (κ)και (και) αξίζει (αξίζει) (ν)να επαναδιατυπωθεί (να επαναδιατυπωθεί), επειδή (επειδή) (ε)είναι (είναι) (τ)το (το) (ε)επαναχρησιμοποιήσιμο μέρος (επαναχρησιμοποιήσιμο μέρος). Μια (Μια) (β)βιβλιοθήκη (βιβλιοθήκη) C (C) που υποστηρίζει μια (που υποστηρίζει μια) (c)callback (c)σας δίνει ακριβώς (σας δίνει ακριβώς) ένα (ένα) κανάλι για να περάσετε (κανάλι για να περάσετε) (κ)κατάσταση (κατάσταση) (μ)μέσα (μέσα) (σ)σε αυτήν την (σε αυτήν την) (c)callback, τον αδιαφανή δείκτη χρήστη (τον αδιαφανή δείκτη χρήστη). (Β)Βάλτε (Βάλτε) (μ)μια (μια) (μ)μετρημένη αναφορά διεπαφής (μετρημένη αναφορά διεπαφής) Pascal πίσω από αυτόν τον (πίσω από αυτόν τον) δείκτη (δείκτη), (κ)κρατήστε μια (κρατήστε μια) (δ)δεύτερη πραγματική (δεύτερη πραγματική) αναφορά ζωντανή δίπλα στην struct (αναφορά ζωντανή δίπλα στην struct) (ώ)ώστε το (ώστε το) αντικείμενο να μην μπορεί (αντικείμενο να μην μπορεί) (ν)να συλλεχθεί στη μέση της κλήσης (να συλλεχθεί στη μέση της κλήσης), (κ)και (και) διαβάστε τη διεπαφή ξανά προς τα έξω (διαβάστε τη διεπαφή ξανά προς τα έξω) (μ)μέσα (μέσα) (σ)σε (σε) μια στατική συνάρτηση cdecl. Τυλίξτε ολόκληρο (Τυλίξτε ολόκληρο) (τ)τον βρόχο οδήγησης (τον βρόχο οδήγησης) (σ)σε (σε) (έ)ένα (ένα) try και απελευθερώστε το (και απελευθερώστε το) εγγενές (εγγενές) πλαίσιο (πλαίσιο) στο (στο) finally. (Τ)Το ίδιο (Το ίδιο) (π)πρότυπο (πρότυπο/template) μεταφέρεται σε (μεταφέρεται σε) (ο)οποιαδήποτε προοδευτική ή (οποιαδήποτε προοδευτική ή) καθοδηγούμενη από callback λειτουργία PDFium όπου ο κώδικας (καθοδηγούμενη από callback λειτουργία PDFium όπου ο κώδικας) Pascal πρέπει (πρέπει) να διατηρήσει (να διατηρήσει) (τ)τον έλεγχο της (τον έλεγχο της) διάρκειας (διάρκειας) (ζ)ζωής ενώ (ζωής ενώ) (η) η (C) C κρατά έναν (κρατά έναν) (δ)δείκτη (δείκτη)
Η ακύρωση είναι (Η ακύρωση είναι) μόνο το ένα μισό (μόνο το ένα μισό) ενός viewer που αποκρίνεται (ενός viewer που αποκρίνεται/responsive). Το (Το) (ά)άλλο (άλλο) μισό δεν είναι η εκ νέου απόδοση σελίδων που (μισό δεν είναι η εκ νέου απόδοση σελίδων που) ήδη σχεδιάσατε (ήδη σχεδιάσατε), (κ)και (και) η διατήρηση (η διατήρηση) του ζουμ και της κύλισης (του ζουμ και της κύλισης) ομαλών σερβίροντας (ομαλών σερβίροντας) (π)προσωρινά αποθηκευμένα (προσωρινά αποθηκευμένα/cached) bitmap (bitmap), το (το) (ο)οποίο καλύπτεται στο (οποίο καλύπτεται στο) άρθρο (άρθρο) μας (μας) για την κρυφή (για την κρυφή) μνήμη (μνήμη) απόδοσης (απόδοσης) και την (και την) (α)απόδοση (απόδοση/performance) του ζουμ (του ζουμ). Για (Για) το (το) πώς η (πώς η) (α)ακυρώσιμη απόδοση (ακυρώσιμη απόδοση) (τ)ταιριάζει σε (ταιριάζει σε) ένα ολοκληρωμένο viewer παράλληλα με (ένα ολοκληρωμένο viewer παράλληλα με) (τ)την (την) (π)πλοήγηση (πλοήγηση), (τ)την (την) (ε)επιλογή (επιλογή), (κ)και την αναζήτηση (και την αναζήτηση), (δ)δείτε την (δείτε την) κατασκευή (κατασκευή) ενός πλούσιου σε χαρακτηριστικά viewer PDF με (ενός πλούσιου σε χαρακτηριστικά viewer PDF με) (τ)το (το) PDFium Component. (Η) Η προοδευτική (προοδευτική) (α)απόδοση που (απόδοση που) (π)περιγράφεται εδώ αποστέλλεται (περιγράφεται εδώ αποστέλλεται) (ω)ως (ως) μέρος (μέρος) (τ)του (του) PDFium Component (γ)για (για) Delphi και Lazarus μαζί με (μαζί με) τα (τα) API φόρτωσης (φόρτωσης), (α)απόδοσης (απόδοσης), (κ)και φορμών που καλύπτονται (και φορμών που καλύπτονται) αλλού σε αυτό (αλλού σε αυτό) (τ)το (το) blog (blog)