乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 63|回复: 4

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

[复制链接]

1

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
7
发表于 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(defun PDS_SORT_XL (XLRANGE)
  54.    (mx-sort  
  55.                   (mx-get-range
  56.              SHEETOBJ
  57.              (strcat "B1:"
  58.                      (chr (+ (cdr XLRANGE) 65))
  59.                      (itoa (car XLRANGE))
  60.              )
  61.            )
  62.            (mx-get-range SHEETOBJ "B1")
  63.            MXC-xlAscending
  64.            Nil
  65.            Nil
  66.            Nil
  67.            Nil
  68.            Nil
  69.            MXC-xlYes
  70.            NIL
  71.            NIL
  72.            MXC-xlTopToBottom
  73.            Nil
  74.   ) ; 问题所在!
  75.   (mx-select
  76.     (mx-get-range SHEETOBJ (strcat "B" (itoa (car XLRANGE))))
  77.   )
  78. )
  79. (defun PDS-EXCEL-QUIT ()
  80.   (vlax-invoke-method
  81.     WB-OBJ "Saveas" "c:\\ex-test1.xls" NIL NIL NIL NIL NIL NIL
  82.    )
  83.   (vla-put-visible XLOBJ 0)
  84.   (vlax-release-object SHEETOBJ)
  85.   (vlax-release-object WB-OBJ)
  86.   (vlax-invoke-method XLOBJ 'quit)
  87.   (vlax-release-object XLOBJ)
  88.   (mapcar '(lambda (x) (set x NIL)) '(WB-OBJ SHEETOBJ XLOBJ))
  89.   (gc)
  90. ) ;PDS-Excel-Quit
回复

使用道具 举报

14

主题

72

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
128
发表于 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)
回复

使用道具 举报

1

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
7
发表于 2003-9-16 22:05:00 | 显示全部楼层
已把:properties-prefix 改为"mxp-"和照您的方法mx-close wb-obj,再release...
但还是不行,从视窗任务管理(Windows Task Manager)中可看到,Excel还没释放!
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2003-9-17 09:35:00 | 显示全部楼层
不要释放xlobj对象,以后就使用这个对象进行操作。这样就不会不断地有excel不能释放了。
这样这样可以应付一下工作了,呵呵
回复

使用道具 举报

1

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
7
发表于 2003-9-17 14:31:00 | 显示全部楼层
缓冲的方式已经有了...
始终还是要彻底完善。因为非常受欢迎哦...大部分的同事已开始采用!
请再想想办法...
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-5 08:41 , Processed in 0.488849 second(s), 63 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表