การทำงานหลายเธรดใน Aspose.Slides สำหรับ Android ผ่าน Java
บทนำ
แม้การทำงานแบบขนานกับการนำเสนอจะเป็นไปได้ (besides parsing/loading/cloning) และส่วนใหญ่ทุกอย่างทำงานได้ดี แต่ก็มีโอกาสเล็กน้อยที่คุณอาจได้รับผลลัพธ์ที่ไม่ถูกต้องเมื่อใช้ไลบรารีในหลายเธรด
เราขอแนะนำอย่างยิ่งว่า ไม่ ควรใช้อินสแตนซ์ Presentation เพียงอันเดียวในสภาพแวดล้อมแบบหลายเธรด เนื่องจากอาจทำให้เกิดข้อผิดพลาดหรือความล้มเหลวที่ไม่คาดคิดและตรวจจับได้ยาก
ไม่ปลอดภัยที่จะโหลด, บันทึก, และ/หรือคล cloning อินสแตนซ์ของคลาส Presentation ในหลายเธรด การดำเนินการเช่นนี้ ไม่ รองรับ หากคุณต้องการทำงานดังกล่าว คุณต้องทำงานแบบขนานโดยใช้กระบวนการหลายตัวที่ทำงานแบบเดียวเท่านั้น — และแต่ละกระบวนการควรใช้อินสแตนซ์การนำเสนอของตนเอง
แปลงสไลด์การนำเสนอเป็นภาพในแบบขนาน
สมมติว่าเราต้องการแปลงสไลด์ทั้งหมดจากการนำเสนอ PowerPoint เป็นภาพ PNG แบบขนาน เนื่องจากไม่ปลอดภัยที่จะใช้อินสแตนซ์ Presentation เพียงอันเดียวในหลายเธรด เราจึงแบ่งสไลด์การนำเสนอเป็นการนำเสนอแยกส่วนและแปลงสไลด์เป็นภาพแบบขนาน โดยใช้การนำเสนอแต่ละอันในเธรดแยกต่างหาก ตัวอย่างโค้ดต่อไปนี้แสดงวิธีทำเช่นนั้น
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++) {
// ดึงสไลด์ i ออกเป็นการนำเสนอแยก.
final Presentation slidePresentation = new Presentation();
slidePresentation.getSlideSize().setSize(slideWidth, slideHeight, SlideSizeScaleType.DoNotScale);
slidePresentation.getSlides().removeAt(0);
slidePresentation.getSlides().addClone(presentation.getSlides().get_Item(slideIndex));
// แปลงสไลด์เป็นภาพในงานแยก.
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();
}
}
}));
}
// รอให้ทุกงานเสร็จสมบูรณ์.
try {
for (Thread t : threads) {
t.join();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
presentation.dispose();
คำถามที่พบบ่อย
ฉันต้องเรียกตั้งค่าลิขสิทธิ์ในทุกเธรดหรือไม่?
ไม่ จำเป็นเพียงทำครั้งเดียวต่อกระบวนการ/โดเมนแอป ก่อนที่เธรดจะเริ่ม หาก license setup อาจถูกเรียกพร้อมกัน (เช่น ระหว่างการเริ่มต้นแบบขี้เกียจ) ให้ทำการซิงโครไนซ์การเรียกนั้น เพราะเมธอดตั้งค่าลิขสิทธิ์เองไม่รองรับหลายเธรด
ฉันสามารถส่งอ็อบเจ็กต์ Presentation หรือ Slide ระหว่างเธรดได้หรือไม่?
ไม่แนะนำให้ส่งอ็อบเจ็กต์การนำเสนอที่กำลังทำงานระหว่างเธรด: ใช้อินสแตนซ์แยกสำหรับแต่ละเธรดหรือสร้างการนำเสนอ/คอนเทนเนอร์สไลด์แยกล่วงหน้าสำหรับแต่ละเธรด วิธีนี้สอดคล้องกับคำแนะนำทั่วไปไม่ให้แชร์อินสแตนซ์การนำเสนอเดียวกันข้ามเธรด
ปลอดภัยหรือไม่ในการทำการส่งออกแบบขนานเป็นฟอร์แมตต่าง ๆ (PDF, HTML, images) หากแต่ละเธรดมีอินสแตนซ์ Presentation ของตนเอง?
ใช่ ด้วยอินสแตนซ์แยกและเส้นทางการส่งออกแยก การทำงานเหล่านี้มักจะทำงานแบบขนานได้อย่างถูกต้อง; หลีกเลี่ยงการใช้วัตถุการนำเสนอหรือสตรีม I/O ที่แชร์กัน
ฉันควรทำอย่างไรกับการตั้งค่าแบบอักษรระดับโลก (โฟลเดอร์, การแทนที่) ในการทำงานหลายเธรด?
ให้เริ่มต้นการตั้งค่าแบบอักษรระดับโลกทั้งหมดใน font settings ก่อนเริ่มเธรดและไม่เปลี่ยนแปลงในระหว่างการทำงานแบบขนาน สิ่งนี้จะขจัดการแข่งขันเมื่อเข้าถึงทรัพยากรแบบอักษรที่แชร์กัน