WEB开发网
开发学院手机开发Symbian 开发 Symbian 中程序和线程对内存的占用 阅读

Symbian 中程序和线程对内存的占用

 2010-06-22 02:57:00 来源:WEB开发网   
核心提示:9.1以前,我们不可以有WSD在symbian的DLL上,Symbian 中程序和线程对内存的占用(2),但从symbian 9.1开始,symbian支持这个通过用EPOCALLOWDLLDATA函数在MMP文件上,线程将调用这个函数,这个函数的功能看起来是这样的:[Copy to clipboard]CODE:vo
9.1以前,我们不可以有WSD在symbian的DLL上。但从symbian 9.1开始,symbian支持这个通过用EPOCALLOWDLLDATA函数在MMP文件上。支持这个的主要的原因是为了把非symbian应用程序移植到symbian里。但symbian不鼓励用这个函数。替代这个symbian提供一些别方法实现这个:

1.用客户端-服务端的架构

2.用TLS(Thread Local Storage 本地线程存储)

给WSD用TLS:

每个DLL将会有TLS (Thread Local Storage本地线程存储)基于每个线程每个DLL.

在DLL里的全部的共用或静态数据可以被组合为一个结构,当线程创建以后这个特殊的结构将在heap里被创建。线程的TLS将被赋值为这个结构的指针。因为这个DLL::settls() 应用程序编程接口以被使用,为了 存取/修改任何共用数据,我们需要以下步局:

用DLL::TLS() 得到结构的指针

用指针定位实际的数据

线程被破坏的时候被TLS指向的结构可能被删除而且TLS可能被调零。

每个用这个技术DLL的将有一个函数.这个函数将照顾到创建包括所有在heap的共用数据和安装DLL的TLS的结构。这个代码可能和以下的这个差不多:

[Copy to clipboard]CODE:

void InitLibrary()

{

//allocate the structure containing global data on heap

GlobalData* p = new GlobalData();

if ( p )

{

Dll::SetTls( p ); //Set this Dll's Tls with this structure

pointer

}

else

//Panic the thread

}

复制代码

这样的DLL可能多带一个照顾空闲空间的函数。当需要使用这个DLL的时候,线程将调用这个函数。这个函数的功能看起来是这样的:

[Copy to clipboard]CODE:

void CleanupLibrary()

{

//Get the Dll's Tls

GlobalData* p = (GlobalData*) Dll::Tls();

if ( p )

{

//Do some global variable specific cleanup activity if

required

Cleanup( p );

delete p; //Deallocate the memory now

}

}

复制代码

特别的是别的被导出的API的DLL将得到DLL的TLS,而且可以用共用变数。这个大部分的时候象这样被独立:

Tags:Symbian 程序 线程

编辑录入:coldstar [复制链接] [打 印]
赞助商链接