文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Arc Engine二次开发资源释放问题

Arc Engine二次开发资源释放问题

时间:2010-10-14  来源:struggle GISer

AE二次开发处理空间数据时,时常遇到资源不能成功释放。

例如:

  1)进行数据格式批量转换或者其他批处理数据的应用程序关闭后,其进程仍然在运行。解决办法必须在退出过程中执行AO的Shutdown()接口

  2)Personal Geodatabase格式数据即PGDB,对其数据进行处理后,在开发的程序彻底退出关闭之前,以独占的方式打开,导致文件被占用,甚至程序其他的功能类都不能访问该数据,必须退出重启后才能释放。此类问题在数据批量处理,质检等过程中经常遇到。有些公司的开发人员无奈之余采用其他方式避开此问题。

 

AE各接口二次开发基本不支持多线程,只能有一个线程进行处理。操作空间数据库的各个接口:IWorkpsace,IFeatureWorkspace,IFeatureClass,IFeatureLayer,IFeature,ICursor等使用时,均不能自行释放资源文件。

例如在函数:

  public void OperPGDB(string pgdbPathName)  

  {

    IWorkspace pWorkspace =null;

    IFeatureClass pFeatureClass = null;

    IFeatrureCursor pFeatureCursor = null;

    IFeature pFeature = null; 

  }

函数中,pFeatureCursor,pFeature对pgdbPathName空间PGDB数据文件进行查询操作,读取其中图层要素,执行完该函数后,pgdbPathName就不能执行释放。必须等待程序关闭后,他才会释放文件。如果应用程序在启动关闭的同一个周期内重复其操作访问,就会报出异常。所以在执行之后要对每个对象函数结束就调用Release的函数对其释放。

  3)上述2)及时释放了资源,但是对IFeatureClass,IWorkspace接口释放时,需要注意:应用程序多个功能类中,均有接口对象,指定同一个文件或者同一个文件时释放操作就要谨慎。

例如:

  calss A

  {

    IFeatureClass pFeatureClass = null;
  }

  calss B

  {

    IFeatureClass pFeatureClass = null;
  }

 

   A a = new A();

   B b = new B();

   A、B两个对象均有pFeatureClass,如果指向同一个文件的同一图层,那在释放A.pFeatureClass时,B的pFeatureClass会也被释放,两者指向相同物理地址。

  综上所述,开发过程中如有全局对象,并且想解决自身应用程序对文件释放问题,代码中就需要考虑,对象释放,和被释放后重新启用的代码机制。

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载