明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2374|回复: 4

[求助]如何释放经lisp+vba呼叫后的记忆体

[复制链接]
发表于 2003-9-14 15:37:00 | 显示全部楼层 |阅读模式
本人因工作需求,开发了可让图中的资料直接传送至EXCEL以方便查询。
由于资料有重复的问题,但只要把EXCEL上的资料经SORT处理后,即可达到要求。
所以在程序上引用了VBA把以上的功能加强。一切都ok...但后来发觉机子在运用此程序后速度越来越慢最后导致当机!!!
经一番查阅后,发现竟是(defun PDS_SORT_XL) 里的MX-SORT部位发生了问题!执行后的记忆体释放不了!而且每一次就增加一个EXCEL记忆体藏在内存!

以下是部分的程序,请各位大侠帮帮忙!无限感激!!!


  1. (defun C:PDS_XL (/ XLRANGE CEOBJ SHEETOBJ WB-OBJ XLOBJ XLV)
  2.   (vl-load-com)
  3.   (setq XLV (PDS_GET_EXCEL_LIB))
  4.   (PDS_CREATE_EXCEL_SHEET)
  5.   (setq XLRANGE (cons 5 15))
  6.   (PDS_SORT_XL XLRANGE) ;如跳过此段,记忆体释放不误!
  7.   (PDS-EXCEL-QUIT)
  8. ) ;PDS_XL


  9. (defun PDS_GET_EXCEL_LIB (/ SYS:DRV OFFICE:DIR OFFICE:DIR1 OFFICE:DIR2 EXLIB)
  10.   (if (= (setq SYS:DRV (getenv "systemdrive")) NIL)
  11.     (setq SYS:DRV "C:")
  12.   )
  13.   (setq OFFICE:DIR (strcat SYS:DRV "\\Program Files\\Microsoft Office\"))
  14.   (setq        OFFICE:DIR1 "office\"
  15.         OFFICE:DIR2 "office10\"
  16.   )
  17.   (cond        ((setq EXLIB (findfile (strcat OFFICE:DIR OFFICE:DIR1 "Excel8.olb")))
  18.          (setq XLV "EX97")
  19.         ) ;Excel 97 & 98
  20.         ((setq EXLIB (findfile (strcat OFFICE:DIR OFFICE:DIR1 "Excel9.olb")))
  21.          (setq XLV "EX2k")
  22.         ) ;Excel 2000
  23.         ((setq EXLIB (findfile (strcat OFFICE:DIR OFFICE:DIR1 "Excel.exe")))
  24.          (setq XLV "EXXP")
  25.         ) ;Excel XP
  26.         ((setq EXLIB (findfile (strcat OFFICE:DIR OFFICE:DIR2 "Excel.exe")))
  27.          (setq XLV "EXXP")
  28.         )
  29.         (t (setq EXLIB NIL))
  30.   ) ;cond
  31.   (if (null mx-acos)
  32.     (if        EXLIB
  33.       (vlax-import-type-library
  34.         :tlb-filename EXLIB
  35.         :methods-prefix "MX-"
  36.         :properties-prefix "MX-"
  37.         :constants-prefix "MXC-"
  38.        )
  39.       (alert "Excel Typelib not exist")
  40.     ) ;if
  41.   ) ; if mx-acos
  42.   XLV
  43. ) ;PDS_get_excel_Lib


  44. (defun PDS_CREATE_EXCEL_SHEET ()
  45.   (setq XLOBJ (vlax-create-object "Excel.Application"))
  46.   (vla-put-visible XLOBJ 1)
  47.   (setq WB-OBJ (vlax-invoke-method
  48.                  (vlax-get-property XLOBJ 'WORKBOOKS)
  49.                  'ADD
  50.                )
  51.   )
  52.   (setq SHEETOBJ (mx-get-activesheet WB-OBJ))
  53. ) ;PDS_create_excel_sheet



  54. (defun PDS_SORT_XL (XLRANGE)
  55.    (mx-sort  
  56.                   (mx-get-range
  57.              SHEETOBJ
  58.              (strcat "B1:"
  59.                      (chr (+ (cdr XLRANGE) 65))
  60.                      (itoa (car XLRANGE))
  61.              )
  62.            )
  63.            (mx-get-range SHEETOBJ "B1")
  64.            MXC-xlAscending
  65.            Nil
  66.            Nil
  67.            Nil
  68.            Nil
  69.            Nil
  70.            MXC-xlYes
  71.            NIL
  72.            NIL
  73.            MXC-xlTopToBottom
  74.            Nil
  75.   ) ; 问题所在!
  76.   (mx-select
  77.     (mx-get-range SHEETOBJ (strcat "B" (itoa (car XLRANGE))))
  78.   )
  79. )


  80. (defun PDS-EXCEL-QUIT ()
  81.   (vlax-invoke-method
  82.     WB-OBJ "Saveas" "c:\\ex-test1.xls" NIL NIL NIL NIL NIL NIL
  83.    )
  84.   (vla-put-visible XLOBJ 0)
  85.   (vlax-release-object SHEETOBJ)
  86.   (vlax-release-object WB-OBJ)
  87.   (vlax-invoke-method XLOBJ 'quit)
  88.   (vlax-release-object XLOBJ)
  89.   (mapcar '(lambda (x) (set x NIL)) '(WB-OBJ SHEETOBJ XLOBJ))
  90.   (gc)
  91. ) ;PDS-Excel-Quit
发表于 2003-9-16 19:19:00 | 显示全部楼层
1\您的‘方法‘和‘属性‘的前缀都是“mx-”
:methods-prefix "mx-"
:properties-prefix "mx-"
2\wb-obj还没有close就被释放指针(mx-close wb-obj)
  
(vlax-release-object wb-obj)
  (vlax-invoke-method xlobj 'quit)
 楼主| 发表于 2003-9-16 22:05:00 | 显示全部楼层
已把:properties-prefix 改为"mxp-"和照您的方法mx-close wb-obj,再release...
但还是不行,从视窗任务管理(Windows Task Manager)中可看到,Excel还没释放!
发表于 2003-9-17 09:35:00 | 显示全部楼层
不要释放xlobj对象,以后就使用这个对象进行操作。这样就不会不断地有excel不能释放了。
这样这样可以应付一下工作了,呵呵
 楼主| 发表于 2003-9-17 14:31:00 | 显示全部楼层
缓冲的方式已经有了...
始终还是要彻底完善。因为非常受欢迎哦...大部分的同事已开始采用!
请再想想办法...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 23:49 , Processed in 0.151030 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表