Multitrådning i Aspose.Slides för Node.js via Java
Introduktion
Även om parallellt arbete med presentationer är möjligt (förutom parsning/laddning/kloning) och allt går bra (ofta), finns det en liten risk att du får felaktiga resultat när du använder biblioteket i flera trådar.
Vi rekommenderar starkt att du inte använder en enda Presentation instans i en multitrådad miljö eftersom det kan leda till oförutsägbara fel eller misslyckanden som inte är lätta att upptäcka.
Det är inte säkert att ladda, spara och/eller klona en instans av en Presentation klass i flera trådar. Sådana operationer inte stöds. 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 från 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, med varje presentation i en separat tråd. Följande kodexempel visar hur man gör detta.
const inputFilePath = "sample.pptx";
const outputFilePathTemplate = "slide_%d.png";
const imageScale = 2;
(async () => {
const presentation = new aspose.slides.Presentation(inputFilePath);
const slideCount = presentation.getSlides().size();
const slideSize = presentation.getSlideSize().getSize();
const slideWidth = slideSize.getWidth();
const slideHeight = slideSize.getHeight();
const conversionTasks = Array.from({ length: slideCount }, async (_, slideIndex) => {
// Extrahera bild i till en separat presentation.
const slidePresentation = new aspose.slides.Presentation();
slidePresentation.getSlideSize().setSize(slideWidth, slideHeight, aspose.slides.SlideSizeScaleType.DoNotScale);
slidePresentation.getSlides().removeAt(0);
slidePresentation.getSlides().addClone(presentation.getSlides().get_Item(slideIndex));
try {
const slide = slidePresentation.getSlides().get_Item(0);
const image = slide.getImage(imageScale, imageScale);
const imageFilePath = outputFilePathTemplate.replace("%d", slideIndex + 1);
image.save(imageFilePath, aspose.slides.ImageFormat.Png);
console.log(`Saved slide ${slideIndex + 1} to ${imageFilePath}`);
} catch (error) {
console.error(`Error processing slide ${slideIndex + 1}: ${error.message}`);
} finally {
slidePresentation.dispose();
}
});
// Vänta på att alla uppgifter ska slutföras.
await Promise.all(conversionTasks);
presentation.dispose();
})();
FAQ
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 lat initiering), synkronisera det anropet eftersom licensinställningsmetoden i sig inte är trådsäker.
Kan jag skicka Presentation- eller Slide-objekt mellan trådar?
Att skicka “live” presentationsobjekt mellan trådar rekommenderas inte: använd oberoende instanser per tråd eller förhandsskapa separata presentationer/slide-behållare för varje tråd. Detta tillvägagångssätt följer den allmänna rekommendationen att inte dela en enda presentationsinstans över 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 utmatningssökvägar parallelliseras sådana uppgifter vanligtvis korrekt; undvik delade presentationsobjekt och delade I/O‑strömmar.
Vad bör jag göra med globala teckensnittsinställningar (mappar, ersättningar) i multitrådning?
Initiera alla globala teckensnittsinställningar innan trådarna startas och förändra dem inte under parallellt arbete. Detta eliminerar tävlingar när delade teckensnittresurser nås.