Multitrådning i Aspose.Slides för Android via Java
Introduktion
Även om parallellt arbete med presentationer är möjligt (förutom parsning/lastning/kloning) och allt går bra (vanligtvis), finns en liten möjlighet att du får felaktiga resultat när du använder biblioteket i flera trådar.
Vi rekommenderar starkt att du inte använder ett enda Presentation-objekt i en multitrådad miljö eftersom det kan leda till oförutsägbara fel eller misslyckanden som är svåra att upptäcka.
Det är inte säkert att läsa in, spara och/eller klona en instans av en Presentation-klass i flera trådar. Sådana operationer stöds inte. Om du behöver utföra sådana uppgifter måste du parallellisera operationerna med flera enklatrådade processer – och varje process bör använda sin egen presentationsinstans.
Konvertera presentationsbilder till bilder parallellt
Låt oss säga att vi vill konvertera alla bilder i en PowerPoint-presentation till PNG‑bilder parallellt. Eftersom det är osäkert att använda en enda Presentation‑instans i flera trådar delar vi upp presentationsbilderna i separata presentationer och konverterar bilderna till bilder parallellt, där varje presentation används i en egen tråd. Följande kodexempel visar hur man gör detta.
String inputFilePath = "sample.pptx";
final String outputFilePathTemplate = "slide_%d.png";
final float imageScale = 2;
Presentation presentation = new Presentation(inputFilePath);
int slideCount = presentation.getSlides().size();
SizeF slideSize = presentation.getSlideSize().getSize();
float slideWidth = (float) slideSize.getWidth();
float slideHeight = (float) slideSize.getHeight();
List<Thread> threads = new ArrayList<Thread>(slideCount);
for (int slideIndex = 0; slideIndex < slideCount; slideIndex++) {
// Extrahera slide i till en separat presentation.
final Presentation slidePresentation = new Presentation();
slidePresentation.getSlideSize().setSize(slideWidth, slideHeight, SlideSizeScaleType.DoNotScale);
slidePresentation.getSlides().removeAt(0);
slidePresentation.getSlides().addClone(presentation.getSlides().get_Item(slideIndex));
// Konvertera slide till en bild i en separat uppgift.
final int slideNumber = slideIndex + 1;
threads.add(new Thread(new Runnable() {
@Override
public void run() {
IImage image = null;
try {
ISlide slide = slidePresentation.getSlides().get_Item(0);
image = slide.getImage(imageScale, imageScale);
String imageFilePath = String.format(outputFilePathTemplate, slideNumber);
image.save(imageFilePath, ImageFormat.Png);
} finally {
if (image != null) image.dispose();
slidePresentation.dispose();
}
}
}));
}
// Vänta på att alla uppgifter ska slutföras.
try {
for (Thread t : threads) {
t.join();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
presentation.dispose();
Vanliga frågor
Behöver jag anropa licensinställning i varje tråd?
Nej. Det räcker att göra det en gång per process/applikationsdomän innan trådarna startar. Om licensinställning kan anropas samtidigt (till exempel under fördröjd initiering), synkronisera det anropet eftersom licensinställningsmetoden i sig inte är trådsäker.
Kan jag skicka Presentation‑ eller Slide‑objekt mellan trådar?
Det rekommenderas inte att skicka “levande” presentationsobjekt mellan trådar: använd oberoende instanser per tråd eller förhands skapa separata presentationer/slid‑behållare för varje tråd. Detta tillvägagångssätt följer den generella rekommendationen att inte dela en enda presentationsinstans mellan trådar.
Är det säkert att parallellisera export till olika format (PDF, HTML, bilder) förutsatt att varje tråd har sin egen Presentation‑instans?
Ja. Med oberoende instanser och separata utdatavägar parallelliseras sådana uppgifter vanligtvis korrekt; undvik delade presentationsobjekt och delade I/O‑strömmar.
Vad ska jag göra med globala teckensnittsinställningar (mappar, ersättningar) i multitrådad miljö?
Initiera alla globala font settings innan trådarna startas och ändra dem inte under parallellt arbete. Detta eliminerar konkurrenssituationer när delade teckensnitt resurser nås.