<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    曙海教育集團論壇Win CE 專區WinCE應用開發 → WindowsMobile開發技術淺析,WinCE在.NET框架下的應用


      共有8215人關注過本帖樹形打印

    主題:WindowsMobile開發技術淺析,WinCE在.NET框架下的應用

    美女呀,離線,留言給我吧!
    wangxinxin
      1樓 個性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


    加好友 發短信
    等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
    WindowsMobile開發技術淺析,WinCE在.NET框架下的應用  發帖心情 Post By:2010-11-26 9:00:01

    在Unix-like系統進行IPC(Inter-process communication)通信,Shared memory是效率最高的,我稱之為IPC的王中王。
      主要IPC的方法
      在Windows Mobile和Windows Embedded CE系統下,主要的IPC方法有以下幾種。
          方法通知數據存儲數據大小
    Named events間接N/AN/A
    Windows messages間接在Message中很小,只能傳輸Integer或者使用COPYDATASTRUCT 傳輸對象
    Point-to-point message queues間接在Message中小型,存在boxing和unboxing問題

    MSMQ直接在Message中小型,存在boxing和unboxing問題
    TCP sockets直接直接發送流(stream)中度
    Memory mapped filesN/Amapped file中度
    RegistryN/A注冊表中度
    File systemN/A文件大型
    DatabaseN/A數據庫大型
    WCFN/AWCF消息

      上述表格參考了Interprocess Communication with the .NET Compact Framework 1.0
      關于上述的IPC的方法,沒有那個最好,選擇的時候需要根據具體需求來決定。這篇文章主要關注Named events和Shared Memory。 我之前也寫過關于其他IPC方法的文章,可以參考如下:
      Windows Message
      .NET Compact Framework下的進程間通信之Windows Message
      MSMQ
      WinCe和Windows Mobile下的MSMQ安裝
      .NET Compact Framework下的進程間通信之MSMQ開發
      Registry
      .NET Compact Framework下注冊表導出工具的開發
      File System
      Windows Mobile和Wince下使用TinyXML進行Native C++的開發
      Database
      .NET Compact Framework下SQL CE的使用 (實現了SqlCeHepler的封裝SqlCeHepler的測試類,見.NET Compact Framework下的單元測試)
      Windows Mobile下Native C++訪問SqlCe的封裝
      SQL Server Express和SQL Server Compact的應用
      .NET Campact Framework下SQL CE兼容性問題
      Windows Mobile下訪問Sqlite的Native C++封裝
      如何壓縮SQLite的數據文件
      還有Point-to-point message queues, TCP sockets等等一部分主題沒有寫,如果有人希望我總結出來,請留言,我后續會補充進去。
      Shared Memory的實現
      實現的代碼主要參考了OpenNETCF的Smart Device Framework。
      三個關鍵的類
      MemoryMappedFile用于封裝共享內存,在Windows Embedded CE下的共享內存是一個Memory Mapped File,也就是一個內存映射文件,在所有進程的都可以訪問的內存中映射文件,操作該共享內存就類似于磁盤物理文件。所以繼承于Stream,通過流來讀寫。
      NamedMutex是進程級別的鎖,在Native C++一般使用CRITICAL_SECTION做鎖,而在.NET Compact Framework會使用monitor,微軟已經把monitor封裝到lock關鍵字中了,注意這個lock不是函數,是C#語言內嵌關鍵字。lock和Monitor等價。
      關于lock和CRITICAL_SECTION的使用請參考下面文章。
      Windows Mobile使用.NET Compact Framework開發多線程程序
      Windows Mobile使用Native C++開發多線程程序
      那么,既然有了lock和CRITICAL_SECTION為什么還需要Mutex呢,從性能來說Mutex的效率比Monitor也就是lock要低,所以我一般會使用lock而不是Mutex,但是lock不能支持跨進程加鎖,所以在這個case,我使用了Mutex。
      .NET Compact Framework本身就提供了一個Mutex的類,可惜只是支持無名Mutex。Mutex分為命名Mutex和無名Mutex,無名的Mutex只能在同一個進程內部使用,不能跨進程使用,所以這里封裝了個NamedMutex來支持命名Mutex,從而支持跨進程的鎖操作。
      EventWaitHandle是通知Event。.NET Compact Framework本身封裝了AutoResetEvent和ManualResetEvent,但是他們都不支持跨進程,所以封裝了EventWaitHandle來實現跨進程的Event通知。
      SharedMemoryWriter
      SharedMemoryWriter負責往共享內存寫數據。
     
      
    private void StartSharedMemoryWriting(){ MemoryMappedFile mmf = MemoryMappedFile.CreateInMemoryMap("SharedMemoryBlock"); int i = 100; while (started) { string s = "SharedMemory:" + i.ToString(); UpdateMessageList(s); byte[] dataBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes(s); // Wait until it is safe to enter. mutex.WaitOne(); try { mmf.Position = 0; mmf.Write(dataBuffer, 0, dataBuffer.Length); } finally { // Release the Mutex. mutex.ReleaseMutex(); } // Raise the event namedEvent.Set(); ++i; if (i > 999) { i = 100; } System.Threading.Thread.Sleep(500); } mmf.Close();}生成系統唯一命名的共享內存,在這個例子中使用了SharedMemoryBlock。每次寫共享內存的時候都通過Named Mutex對該內存加鎖。當寫完畢后通過Named Event通知SharedMemoryReader(讀共享內存)的進程。
      SharedMemoryReader
      SharedMemoryReader負責讀取共享內存的數據。
     
      
    private void StartSharedMemoryReading(){ MemoryMappedFile mmf = MemoryMappedFile.CreateInMemoryMap("SharedMemoryBlock"); byte[] dataBuffer = new byte[1024; while (started) { if (namedEvent.WaitOne()) { if (!started) { break; } namedEvent.Reset(); // Wait until it is safe to enter. if (mutex.WaitOne()) { try { mmf.Position = 0; mmf.Read(dataBuffer, 0, 50); } finally { // Release the Mutex. mutex.ReleaseMutex(); } } string s = System.Text.ASCIIEncoding.ASCII.GetString(dataBuffer, 0, 50); UpdateMessageList(s); } } mmf.Close();}打開同樣名字(SharedMemoryBlock)的共享內存,這個進程會掛起直到收到Named Event的消息,每次讀取的時候都需要使用Named Mutex來加鎖。
     
     


    支持(2中立(0反對(0單帖管理 | 引用 | 回復 回到頂部

    返回版面帖子列表

    WindowsMobile開發技術淺析,WinCE在.NET框架下的應用








    簽名
    主站蜘蛛池模板: 青青操免费在线视频| 日本高清va不卡视频在线观看| 粗大的内捧猛烈进出视频| 精品久久久久香蕉网| 看全色黄大色黄女片爽毛片| 男女一边摸一边爽爽视频| 波多野结衣在线观看免费区| 欧美色图你懂的| 欧美乱大交xxxxxbbb| 日韩精品电影在线观看| 日韩一卡二卡三卡四卡| 无人区免费高清在线观看| 局长的又长又粗慧芳| 国产麻豆精品精东影业av网站| 在线观看无码AV网站永久免费 | 免费亚洲视频在线观看| 亚洲综合激情九月婷婷| 亚洲欧美日韩国产综合| 亚洲国产美女精品久久久久| 久久机热re这里只有精品15| 中文字幕一区二区三区四区| www.噜噜噜| 黄色在线视频网| 美女扒开尿口给男人爽免费视频| 男男chinese同志gay露脸飞机| 欧美激情在线一区二区三区 | 美女一级毛片视频| 波多野结衣免费观看视频| 欧美在线一级精品| 日本牲交大片免费观看| 婷婷综合激情网| 欧洲美女与动性zozozo| 日本精品视频一区二区三区| 嫩草影院在线观看精品视频| 国产精品美女久久久久av超清| 国产亚洲真人做受在线观看| 伊人久久大香线蕉av一区二区| 亚洲va久久久噜噜噜久久| 中文字幕无码乱人伦| 91精品欧美激情在线播放| 精品久久免费视频|