青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 2, 文章 - 73, 評論 - 60, 引用 - 0
數據加載中……

[S60]ARM平臺獨有問題 Writable Static Data in DLLs

[S60] ARM平臺獨有問題 Writable Static Data in DLLs
2007-07-08 16:59
在編譯arm平臺程序的時候,出現如下錯誤提示:
ERROR: Dll 'AppName[UID].APP' has initialised data.
或者:
ERROR: Dll 'AppName[UID].APP' has uninitialised data.
(擴展名APP的應用程序其實也是一個DLL。)

而在為模擬器編譯的時候,這個問題不會出現。這曾經導致我在完成完整的設計,編碼和調試后,
被迫放棄原有設計。

從這條錯誤信息的字面意思是什么也看不出來的。
initialised 和 uninitialised都一樣有問題。
其實真正的含義是Dll里存在可寫的全局變量。

大家知道在程序運行的時候,DLL只會被裝載一次。在Windows平臺,每個進程都有自己獨立的DLL空間。也就是說,不同進程裝載同一個DLL,互相之間是獨立的。只有在一個進程內,才是共享的。但是S60平臺的設計是所有進程都共享同一個DLL空間。這樣的設計顯然是出于節約內存的目的,是很有必要的。但是這樣就帶來一個問題,那就是DLL里不可以有可寫的全局變量,否則就要造成混亂。A進程對變量的改寫會直接影響到B進程,這是程序設計者所不愿意看到的。所以,S60平臺的編譯器就禁止了在DLL內申明可寫全局變量。但是全局變量還是可以用的,只要加上const申明即可。

一般來說,在做DLL設計的時候,的確不鼓勵使用可寫全局變量。即使是windows平臺,DLL的可寫全局變量也會在不同模塊之間帶來問題。當遇到這個編譯器錯誤的時候,應該設法修改設計,回避使用全局變量。

但是因為APP實際上也是DLL,這就導致連S60的主程序也不能使用可寫的全局變量,這個在某些時候就成了問題,全局變量畢竟是一個重要的實現手段。對此,S60提供了線程局部存儲(
thread local storage)來解決問題。
TLS的關鍵是兩個函數:
void Dll::SetTls(void*)和void* Dll::Tls()
SetTls用于將任意類型的指針保存到線程局部存儲中,而Tls()則取出該指針。
指針指向在堆上分配的一塊內存。一個線程只能有一個局部存儲變量。所以,如果你有很多全局變量,就要定義一個結構,把所有的全局變量封裝在其中。這是挺別扭的,不過S60 3rd據說就支持dll的可寫全局變量了。

tls樣例代碼:

設置
GlobalData* p = new GlobalData();
if ( p )
{
   Dll::SetTls( p );
}

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

 

在Symbian上如何定義全局變量

方法1(推薦)把這個變量定義成AppUi類的私有成員,在創建view時將這個變量傳引用(或傳指針)到view中,這樣view就能隨時訪問它了。

方法2.把這個變量定義成AppUi類的私有成員,并為它寫公共的訪問函數
// CMyAppUi
public: // new methods
   TInt Share(); // return iShare
private:
JAVA手機網[www.cnjm.net]   TInt iShare;
在View里通過下面的方式訪問這個變量:
// 如果View繼承自CAknView
CMyAppUi* appUi = static_cast<CMyAppUi*>(AppUi());
appUi->Share(); // :)
// 如果View是其它類型
CMyAppUi* appUi = static_cast<CMyAppUi*>(CCoeEnv::Static()->AppUi());
appUi->Share(); // :)
方法3.使用單態類,參考諾基亞論壇上的文檔:
Tip Of The Month: How To Implement A Singleton Class In Symbian OS



 

How to implement a singleton class in Symbian OS        ID: TTS000222

Version 1.1
Published at www.forum.nokia.com on October 19, 2006.

Overview

The singleton pattern is one of the best-known patterns in software engineering. Essentially, a singleton is a class which only allows a single instance of itself to be created, and usually gives simple access to that instance.

How to use thread local storage (TLS) to implement a singleton class

In Symbian OS, each DLL that is loaded in each thread has a machine word of thread-specific memory that can be written to and read — but no other static memory, which is why you can't have static class member variables. Since static class member variables are usually used to implement the singleton pattern, in Symbian OS we have to get around this, for instance by using TLS.

The following code demonstrates a singleton object whose NewL function uses TLS to test whether an object of its own type has been created. If it has, it simply returns the pointer stored in TLS, converted to its own type. If not, it instantiates an object of its own type, stores it in TLS, and then returns it.

Note that this assumes that no other class in the DLL that includes this class uses TLS. If this is not the case, you must write a singleton manager class, which uses TLS to store a pointer to a structure of pointers to all the singleton classes that the program needs.

Example 1: Singleton implementation based on TLS

  ==============

  CMySingleton.h

  ==============

 

  class CMySingleton : public CBase

      {

  public: // constructor and destructor

      static CMySingleton* NewL();

      virtual ~CMySingleton();

  private: // constructors

      CMySingleton(); // private because of the singleton pattern; it is

                      // guaranteed that only NewL will call it

      void ConstructL();

  public: // other functions

      ...

  private: // other functions

      ...

  private: // data

      ...

      }

 

  ================

  CMySingleton.cpp

  ================

 

  CMySingleton::CMySingleton* NewL()

      {

      CMySingleton* singleton;

      // Check thread local storage:

      if ( Dll::Tls() == NULL )

          {

          // TLS is still null, which means that no CMySingleton has

          // been instantiated yet.  Do so now, and return that

          // instance:

          singleton = new ( ELeave ) CMySingleton();

          CleanupStack::PushL( singleton );

          singleton->ConstructL();

          CleanupStack::Pop( singleton );

          // Store a pointer to the new instance in thread local storage:

          TInt err = Dll::SetTls( static_cast<TAny*>( singleton ) );

          if ( err == KErrNone )

              {

              return singleton;

              }

          else

              {

              delete instance;

              User::Leave( err );

              return NULL;

              }

          }

      else

          {

          // CMySingleton has been instantiated once already, so return

          // that instance:

          singleton = static_cast<CMySingleton*>( Dll::Tls() );

          return singleton;

          }

      }

 

TLS on S60 3rd Edition

Since applications from S60 3rd Edition onwards are implemented as EXE programs, Dll::Tls() is not available anymore. Instead, TLS functionality is implemented in UserSvr class (e32svr.h):

static TInt DllSetTls(TInt aHandle, TAny *aPtr);

static TAny *DllTls(TInt aHandle);

static void DllFreeTls(TInt aHandle);

Note that EXE programs can contain writeable static data, but this is not recommended to be used except as a last resort.

Using class CCoeStatic to implement a singleton class

A simpler way of implementing singletons than using TLS is possible for those classes which use the CCoeEnv class. Since CCoeEnv is a part of the UI control framework, this concerns only applications, not application engines.

This applies also to S60 3rd Edition and later editions.

Example 2: Singleton implementation based on CCoeStatic

  ==============

  CMySingleton.h

  ==============

 

  /**

   * Example implementation of a singleton class by means of inheriting

   * from CCoeStatic.

   */

  class CMySingleton : public CCoeStatic

      {

 

  public: // constructors and destructor   

 

      /**   

       * Returns an instance of this class. When called for the first

       * time, a new instance is created and returned.  After that,

       * calling InstanceL returns the same instance that was created

       * earlier.

       *  

       * @return A pointer to a CMySingleton object   

       */   

      static CMySingleton* InstanceL();   

 

  private: // constructor

 

      /**   

       * Default constructor is private because we are using the

       * singleton design pattern.

       */   

      CMySingleton();   

 

      ...

 

      }

 

 

  ================

  CMySingleton.cpp

  ================

 

  // -------------------------------------------------------------------------

  // CMySingleton::CMySingleton

  // C++ default constructor. It is private because we are using the

  // singleton design pattern.

  // -------------------------------------------------------------------------

  CMySingleton::CMySingleton()

      : CCoeStatic( KUidMySingleton )

      {

      }

 

  // -------------------------------------------------------------------------

  // CMySingleton::InstanceL

  // Returns an instance of this class. When called for the first time,

  // a new instance is created and returned.  After that, calling

  // InstanceL returns the same instance that was created earlier.

  // Note that the UID passed to CCoeEnv::Static needs to be unique.

  // -------------------------------------------------------------------------

  CMySingleton* CMySingleton::InstanceL()

      {

      CMySingleton* instance = static_cast<CMySingleton*>

          ( CCoeEnv::Static( KUidMySingleton ) );

      if ( !instance )

          {

          instance = new ( ELeave ) CMySingleton;

          CleanupStack::PushL( instance );

          instance->ConstructL();

          CleanupStack::Pop();

          }

      return instance;

     }

posted on 2008-06-02 20:23 郭天文 閱讀(979) 評論(0)  編輯 收藏 引用 所屬分類: S60

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品一区三区| 国产亚洲人成a一在线v站| 欧美一区二区三区日韩| 国产精品久久夜| 国内精品视频在线播放| 国产精品网站一区| 国产精品免费小视频| 欧美精品色网| 欧美交受高潮1| 欧美日本在线视频| 欧美xart系列在线观看| 毛片一区二区| 欧美少妇一区| 国产视频久久久久| 一区在线视频| 亚洲香蕉伊综合在人在线视看| 亚洲乱码国产乱码精品精98午夜| 亚洲成色www久久网站| 红桃视频成人| 在线观看日韩一区| 亚洲一区成人| 久久久亚洲人| 中文亚洲欧美| 久久夜色精品国产欧美乱| 久久国产乱子精品免费女| 久久精品成人一区二区三区| 亚洲人成在线观看一区二区| 国产精品久久久久9999高清| 欧美日韩综合在线| 红桃视频亚洲| 久久九九全国免费精品观看| 国产在线不卡| 欧美一区二区免费观在线| 亚洲破处大片| 欧美激情在线播放| 一区二区冒白浆视频| 欧美a级片一区| 国产日韩欧美二区| 亚洲视频综合在线| 亚洲丰满少妇videoshd| 欧美在线观看视频| 欧美体内谢she精2性欧美| 久久一区免费| 国产亚洲一二三区| 亚洲欧美激情一区二区| 蜜臀久久99精品久久久久久9| 一本色道久久综合亚洲精品不 | 亚洲欧美视频在线观看视频| 免费短视频成人日韩| 午夜亚洲视频| 亚洲成色777777在线观看影院| 欧美多人爱爱视频网站| 欧美激情在线有限公司| 亚洲无吗在线| 久久久久久久久蜜桃| 91久久极品少妇xxxxⅹ软件| 亚洲日本在线视频观看| 欧美三级视频在线| 久久久久国产精品午夜一区| 午夜一区二区三视频在线观看| 国产精品久久久久久久久动漫| 欧美日韩高清区| 亚洲精品乱码久久久久久日本蜜臀| 亚洲国产欧美日韩| 国产精品成av人在线视午夜片| 午夜激情综合网| 欧美日本国产精品| 欧美aaaaaaaa牛牛影院| 国产精品资源在线观看| 亚洲美女中文字幕| 一区在线播放视频| 欧美一区二区三区在线看| 亚洲欧洲综合| 久久久另类综合| 午夜久久资源| 国产欧美日韩中文字幕在线| 欧美国产视频在线观看| 1769国产精品| 久久精品亚洲乱码伦伦中文| 亚洲免费在线电影| 欧美激情视频一区二区三区在线播放 | 久久中文字幕一区| 国产日韩高清一区二区三区在线| 亚洲乱码精品一二三四区日韩在线 | 国产综合18久久久久久| 亚洲一区精品电影| 久久久久久夜| 亚洲三级毛片| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 久久精品日产第一区二区| 久久人人97超碰人人澡爱香蕉| 韩国精品在线观看| 欧美1区2区视频| 一区二区免费在线播放| 久久九九热免费视频| 亚洲精品国产精品国自产在线| 欧美视频一区二区| 久久电影一区| 亚洲一区二区在线视频| 欧美成人免费播放| 亚洲男女自偷自拍图片另类| 国内成人在线| 国产精品视频九色porn| 欧美看片网站| 久久久中精品2020中文| 亚洲视频1区2区| 欧美激情一区二区三区在线视频 | 国产精品捆绑调教| 久久福利资源站| 亚洲男人影院| 一区二区三区四区五区在线| 欧美激情一区二区在线| 裸体素人女欧美日韩| 久久久999成人| 性欧美video另类hd性玩具| 99国产精品99久久久久久| 亚洲国产第一| 99pao成人国产永久免费视频| 在线观看国产欧美| 亚洲国产高清自拍| 91久久精品国产91久久性色| 久久三级福利| 久久大综合网| 免费成人高清| 国产精品国产三级欧美二区 | 91久久精品一区| 亚洲国产综合在线看不卡| 亚洲福利一区| 亚洲五月婷婷| 久久精品日韩一区二区三区| 久久久久一区| 欧美体内谢she精2性欧美| 国产精品视频一二三| 国产精品青草久久| 在线播放一区| 亚洲午夜久久久| 美国三级日本三级久久99| 亚洲清纯自拍| 欧美一区二区三区精品| 欧美成人综合网站| 国产综合色产在线精品| 在线视频免费在线观看一区二区| 久久不射网站| 一区二区三区四区精品| 久久美女性网| 国产一区二区日韩精品| 亚洲男人的天堂在线aⅴ视频| 欧美成人tv| 欧美中文在线观看| 国产女主播在线一区二区| 一本久久精品一区二区| 亚洲高清不卡| 女主播福利一区| 亚洲国产精品va| 免费高清在线视频一区·| 性久久久久久久久| 国产性天天综合网| 欧美一区二区成人6969| 亚洲在线第一页| 国产一区欧美日韩| 久久中文字幕一区| 欧美高清在线观看| 99这里只有久久精品视频| 亚洲一区bb| 亚洲人成网站影音先锋播放| 欧美福利一区| 性欧美超级视频| 久久精品一区二区三区四区| 1000部国产精品成人观看| 亚洲国产一区二区三区a毛片 | 久久不射2019中文字幕| 亚洲第一页自拍| 夜夜夜久久久| 狠狠色狠色综合曰曰| 亚洲黄一区二区| 国产一区二区在线观看免费| 欧美大片一区二区三区| 国产精品久久久99| 欧美激情成人在线视频| 国产精品久久久久9999高清| 免费试看一区| 国产欧美精品一区二区三区介绍| 玖玖综合伊人| 国产日产高清欧美一区二区三区| 亚洲国产高清高潮精品美女| 国产亚洲激情| 亚洲欧美成人在线| 亚洲无玛一区| 国产精品videossex久久发布| 欧美va天堂在线| 在线看国产一区| 久久久91精品国产一区二区精品| 亚洲自拍偷拍色片视频| 欧美日韩国产影片| 亚洲欧洲日本专区| 一区二区国产精品| 欧美日韩午夜视频在线观看| 亚洲国产精品传媒在线观看| 亚洲伦伦在线| 国产精品免费看|