• jacon


    com的线程回收不由java垃圾回收器进行处理,因此,每new一次jacob提供的类就要分配一定大小的内存给该操作,new出来的这个com对象在使用结束之后产生的垃圾java是无法回收的,new出来的对象越来越多,内存溢出就不可避免了,即使增加jvm内存也只是暂时的,迟早这些对象会把内存用完。既然java不能回收这些垃圾,那么com组件也应该提供了回收垃圾的方法,最后得知是ComThread.InitSTA()和ComThread.Release()方法,这两个方法其实就是初始化一个线程和结束这个线程,在创建com对象的时候初始化一个线程来运行这个对象,这个对象使用结束之后再结束线程,

    /** * @fileName MSWordManager.java

    * @description 该类用于查找word文档指定位置并将图片插入

    * @date 2011-10-21 * @time * @author wst */

    public class MSWordManager {

     private Logger log = Logger.getLogger(MSWordManager.class);

     // word文档

     private Dispatch doc;

     // word运行程序对象

     private ActiveXComponent word;

     // 所有word文档集合

     private Dispatch documents;

     // 选定的范围或插入点

     private Dispatch selection;

     public static int instanceSize=3;

     //一个线程存放的MSWordManager数量

     public MSWordManager(int index) {

     if (word == null) {

     word = new ActiveXComponent("Word.Application");

     //为true表示word应用程序可见

     word.setProperty("Visible", new Variant(false));

     }

     if (documents == null){

     documents = word.getProperty("Documents").toDispatch();

     }

     if(index==0){

     ComThread.InitSTA();

     //初始化一个线程并放入内存中等待调用 } }

     /** * 打开一个已经存在的文档 * @param docPath 要打开的文档

     * @param key 文本框的内容,根据该key获取文本框当前位置

     * @date 2011-12-9 * @author wst */

     public void openDocumentAndGetSelection(String docPath, String key) {

     try{

     closeDocument() // 打开文档

     doc = Dispatch.call(documents, "Open", docPath).toDispatch();

     // shapes集合

     Dispatch shapes = Dispatch.get(doc, "Shapes").toDispatch();

     // shape的个数

     String Count = Dispatch.get(shapes, "Count").toString();

     for (int i = 1; i <= Integer.parseInt(Count); i++) {

     // 取得一个shape

     Dispatch shape = Dispatch.call(shapes, "Item", new Variant(i)).toDispatch();

     // 从一个shape里面获取到文本框

     Dispatch textframe = Dispatch.get(shape, "TextFrame").toDispatch();

     boolean hasText = Dispatch.call(textframe, "HasText").toBoolean();

     if (hasText) {

     // 获取该文本框对象

     Dispatch TextRange = Dispatch.get(textframe, "TextRange").toDispatch();

     // 获取文本框中的字符串

     String str = Dispatch.get(TextRange, "Text").toString();

     //获取指定字符key所在的文本框的位置

     if (str != null && !str.equals("") && str.indexOf(key) > -1) {

     //当前文本框的位置

     selection = Dispatch.get(textframe, "TextRange").toDispatch();

     // 情况文本框内容

     Dispatch.put(selection, "Text", ""); break; } }

     } }catch(Exception e){ log.error(e); return; }

     }

     /** * 在当前位置插入图片

     * @param imagePath 产生图片的路径

     * @return 成功:true;失败:false */

     public boolean insertImage(String imagePath) {

     try{

     Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),"AddPicture", imagePath);

     }catch(Exception e){

     log.error(e); return false;

     }

     return true; }

     //关闭文档 public void closeDocument()

     { if (doc != null) { Dispatch.call(doc, "Close"); doc = null; }

     }

     //关闭全部应用

     public void close(int index) {

     if (word != null) { Dispatch.call(word, "Quit"); word = null; }

     selection = null; documents = null; if(index==instanceSize){

     //释放占用的内存空间,因为com的线程回收不由java的垃圾回收器处理

     ComThread.Release(); }

     }

     }

  • 相关阅读:
    Visualizing Concurrency in Go · divan's blog
    Trac常用插件描述!
    分布式 OLTP 数据库
    【SDCC讲师专访】PingCAP联合创始人兼CEO刘奇:好的产品应开源,不闭门造车-CSDN.NET
    XiaoMi/themis: Themis provides cross-row/cross-table transaction on HBase based on google's percolator.
    TiDB首页、文档和下载
    TeamGantt vs JIRA 2016 Comparison | FinancesOnline
    HandlerInterceptor拦截实现对PathVariable变量的读取
    大叔来说说Markdown的使用
    springcloud~配置中心实例搭建
  • 原文地址:https://www.cnblogs.com/catWang/p/4519406.html
Copyright © 2020-2023  润新知