Microsoft CSIP WindowsMobile MEDC 合作伙伴 体验中心
设Winbile为首页    |    加Winbile到收藏夹          
欢迎光临

[转].Net Micro Framework研究—实现SideShow窗体界面

第1楼
2008-06-26
男
职务:普通用户
积分:407
等级: 初级程序员三级
金钱: 0
精华: 0
帖子数:27
发帖数前100位(97)

来自:叶帆工作室           作者:叶帆
 
.Net Micro Framework不支持文件系统(目前该项功能正在研发之中),所以无法像Windows和windows ce平台那样把需要永久保存的数据保存到文件之中。内存中保存的数据只要系统一掉电,所有的数据也都消失了,这对一些需要保存参数的应用来说真是不妙。
这几天在研究MF触摸屏功能时就遇到该问题,因为触摸屏校准之后,需要保存校准后的参数,否则MF一重启,难道还需要重新校准不成?
 感谢Donald Thompson 和 Rob S. Miles,从他们的大作上找到了问题的解决办法。办法就是把对象保存到Flash(EEPROM)中(有点像对象的二进制序列化)。
下面是我整理的示例代码(实现比较简单,但总觉得不太正规,不知道能存多大,也搞不清楚数据到底存放在什么位置了。):
usingSystem;
usingMicrosoft.SPOT;
usingSystem.Collections;
usingSystem.Threading;
 
namespaceDataStorage
{
   publicclassProgram
    {      
       publicstaticvoidMain()
        {
           FlashDatasfd =FlashDatas.Load();
            fd.dump();
            fd.Flag ="adfg";
           //fd.Items.Clear();               
           //fd.AddItem(new FlashData(55, "1aaa"));
           //fd.AddItem(new FlashData(66, "2bbb"));
           //fd.AddItem(new FlashData(77, "3ccc"));
           //fd.AddItem(new FlashData(88, "4ddd"));
            fd.Save();
           Thread.Sleep(3000);            
        }
 
        [Serializable]
       privateclassFlashData
        {
           publicDateTimedate;
           publicintiData;
           publicstringsData;
           publicFlashData(intiData,stringsData)
            {
                date =DateTime.Now;
                this.iData = iData;
               this.sData = sData;
            }
 
           publicoverridestringToString()
            {
               returndate.ToString() +" "+ iData.ToString() +" "+ sData;
            }
        }
 
        [Serializable]
       privateclassFlashDatas
        {
           publicDateTimeCreateTime =DateTime.Now;
           publicstringFlag = @"http://blog.csdn.net/yefanqiu/";
           publicArrayListItems =newArrayList();
 
           publicvoiddump()
            {
               Debug.Print(CreateTime.ToString());
               Debug.Print(Flag);
               foreach(FlashDataIteminItems)
                {
                   if(Item !=null)
                    {
                        Debug.Print(Item.ToString());
                    }
                }
            }
           publicvoidAddItem(FlashDataItem)
            {
                Items.Add(Item);
            }
 
           //调入数据
           publicstaticFlashDatasLoad()
            {
               ExtendedWeakReferenceewr =ExtendedWeakReference.RecoverOrCreate(
                       typeof(FlashDatas),                      //类型,任意类都可以,其名称起到一个索引作用
                        0,                                        //ID号,这个数据比较有用,不同ID号代表不同数据
                       ExtendedWeakReference.c_SurvivePowerdown);//该标志和.c_SurviveBoot 区别不大
                ewr.Priority = (Int32)ExtendedWeakReference.PriorityLevel.Important;
 
               FlashDatasdata = ewr.TargetasFlashDatas;
               if(data ==null)
                {
                    data =newFlashDatas();
                }
               returndata;
            }        
 
           //保存数据
           publicvoidSave()
            {
                ExtendedWeakReferenceewr =ExtendedWeakReference.RecoverOrCreate(typeof(FlashDatas), 0,ExtendedWeakReference.c_SurvivePowerdown);
                ewr.Priority = (Int32)ExtendedWeakReference.PriorityLevel.Important;
                ewr.Target =this;
            }
        }
    }
}
以上代码在Digi开发板上测试成功,断电之后,再上电,保存的数据确实没有丢失。
 
2008-07-22 10:46 回复 | 引用 | 编辑 | Top



Copy Right© CSIP 信息产业部软件与集成电路促进中心 All Rights Reserved 版权所有 Winbile v2.0 (Debug Build: 0.15623) 京ICP备06020771号
© 2008
. 页面执行: 0.203秒. 内存使用: 230.9MB. 8 次数据库查询.