Microsoft   CSIP    WindowsMobile    MEDC    合作伙伴    联合实验室
设为首页    |    加到收藏夹          
欢迎光临

[CF Skills]如何在预定的时间运行你的程序

第1楼
2007-01-12
职务:超级版主
积分:13345
等级: 技术总监
金钱: 0
精华: 4
帖子数:762
发帖数前10位(9)

如何在预定的时间运行应用程序呢?就比如一个自定义的闹钟程序。如何在.NET Compact Framework中实现这样一个功能,好的,先来看看从MSDN上可以查到的这样一个函数:

BOOL CeRunAppAtTime(

  TCHAR* pwszAppName,

  SYSTEMTIME* lpTime

}

值得注意的是第二个参数是SystemTime的结构。这在.NET Compact Framwork中转化过来并不是一件直接的事。

        public static void RunAppAtTime(string s, DateTime dt)

        {

            //首先将DateTime转化成Windows FileTime(UTC)

            long fileStartTime = dt.ToFileTime();

            long localFileStartTime = 0;

            //然后将UTC file time转成本地file time

            FileTimeToLocalFileTime(ref fileStartTime, ref localFileStartTime);

            SystemTime systemStartTime = new SystemTime();

            //再将本地file time 转化成systemtime结构

            FileTimeToSystemTime(ref localFileStartTime, systemStartTime);

            CeRunAppAtTime(s, systemStartTime);

        }

#region invoke methods

        [DllImport("CoreDLL.dll")]

        public static extern int CeRunAppAtTime(string application,

SystemTime startTime);

        [DllImport("CoreDLL.dll")]

        public static extern int FileTimeToSystemTime(ref long lpFileTime,

SystemTime lpSystemTime);

        [DllImport("CoreDLL.dll")]

        public static extern int FileTimeToLocalFileTime(ref long lpFileTime,

ref long lpLocalFileTime);

#endregion

 

这样的程序是可以运行的,我们可以用如下的代码测试一下:

            DateTime startTime = DateTime.Now + new TimeSpan(0, 1, 0);

            string s = @"\Windows\BubbleBreaker.exe";

            Winbile.AtTime.RunAppAtTime(s,startTime);

可以看到在一分钟以后BubbleBreaker运行起来了,这似乎不错。但是对于长时间间隔的appCall这就行不通了,在大多数机器下,CeRunAppAtTime并不能在长时间间隔下工作(例如机器已经Suspend),那么怎么让程序无论是挂起还是lowpower下都一直运行呢?这时候,可以参考SDF2.1里面提供的一个叫做LargeIntervalTimer的东东,故名思意就是大时间间隔的计时器。用法很简单,指定几个属性就OK了:

        public static void RunAtLargeInterval(EventHandler myhandler)

        {

            OpenNETCF.WindowsCE.LargeIntervalTimer m_lit = new OpenNETCF.WindowsCE.LargeIntervalTimer();

            // 这里设为从今后 1天开始

            m_lit.FirstEventTime = DateTime.Now.AddDays(1);

            // 之后7天一次

            m_lit.Interval = new TimeSpan(7, 0, 0, 0);

            // 反复

            m_lit.OneShot = false;

            // 挂上一个事件处理器

            m_lit.Tick += myhandler; 

            // 启动

            m_lit.Enabled = true;

        }

这样不论是你的自定义的日程表,还是你的GPS纪录器或者其他此类必须长期运行在时间轴上的应用程序就可以顺畅的一直运行了,不必担心机器挂起,也没有任何冗余的代码。你只需要写好自己的EventHandler

完整示例见附件



 

附件:
DemoRunAppAtTime.rar(22.22KB)  

Freesc Huang - .Net Micro Framework

MII-MS embedded lab AT CSIP

blog:http://fox23.cnblogs.com

website: microframework.cn
2008-02-03 03:45 回复 | 引用 | 编辑 | Top

Re: [CF Skills]如何在预定的时间运行你的程序

第2楼
2008-02-26
职务:普通用户
积分:7
等级: none
金钱: 0
精华: 0
帖子数:7
发帖数前500位(331)

看起来是个好东东!!!!!!!!!!!!!!!!!!
 
2008-02-26 16:32 回复 | 引用 | 编辑 | Top

Re: [CF Skills]如何在预定的时间运行你的程序

第3楼
2008-02-26
男
职务:普通用户
积分:235
等级: 普通用户
金钱: 0
精华: 0
帖子数:100
发帖数前75位(53)

研究一下,谢谢
 
2008-02-27 11:00 回复 | 引用 | 编辑 | Top

Re: [CF Skills]如何在预定的时间运行你的程序

第4楼
2008-02-27
职务:普通用户
积分:3
等级: none
金钱: 0
精华: 0
帖子数:3
无等级(801)

谢谢分享!
 
2008-02-27 17:27 回复 | 引用 | 编辑 | Top

Re: [CF Skills]如何在预定的时间运行你的程序

第5楼
2008-03-28
职务:普通用户
积分:12
等级: 初级程序员一级
金钱: 0
精华: 0
帖子数:5
发帖数前500位(473)

正需要。。。。
 
2008-03-31 20:51 回复 | 引用 | 编辑 | Top

Re: [CF Skills]如何在预定的时间运行你的程序

第6楼
2008-01-25
职务:普通用户
积分:33
等级: 初级程序员一级
金钱: 0
精华: 0
帖子数:15
发帖数前200位(163)

强烈支持哈~下下来 仔细学习一下~
 
2008-04-01 11:12 回复 | 引用 | 编辑 | Top

Re: [CF Skills]如何在预定的时间运行你的程序

第7楼
2007-03-22
职务:普通用户
积分:47
等级: 初级程序员一级
金钱: 0
精华: 0
帖子数:14
发帖数前200位(172)

支持..学习!!!
 
2008-04-02 09:55 回复 | 引用 | 编辑 | Top

Re: [CF Skills]如何在预定的时间运行你的程序

第8楼
2007-07-05
职务:普通用户
积分:10
等级: 初级程序员一级
金钱: 0
精华: 0
帖子数:1
无等级(0)

     FileTimeToSystemTime(reflocalFileStartTime, systemStartTime);
 
  excp.ToString() "System.NotSupportedException: NotSupportedException\r\n位于 CeRunAppAtTimeSetting.Form1.RunAppAtTime()\r\n位于 CeRunAppAtTimeSetting.Form1.Form1_Load()\r\n位于 System.Windows.Forms.Form.OnLoad()\r\n位于 System.Windows.Forms.Form._SetVisibleNotify()\r\n位于 System.Windows.Forms.Control.set_Visible()\r\n位于 System.Windows.Forms.Application.Run()\r\n位于 CeRunAppAtTimeSetting.Program.Main()\r\n" string

 
2008-05-13 16:54 回复 | 引用 | 编辑 | Top

Re: [CF Skills]如何在预定的时间运行你的程序

第9楼
2007-10-08
职务:普通用户
积分:31
等级: 初级程序员一级
金钱: 0
精华: 0
帖子数:13
发帖数前200位(183)

请问在C++里怎么做呢?
 
2008-05-26 10:18 回复 | 引用 | 编辑 | Top

Re: [CF Skills]如何在预定的时间运行你的程序

第10楼
2008-08-28
男
职务:普通
积分:2
等级: 0
金钱: 0
精华: 0
帖子数:1
无等级(0)

LargeIntervalTimer 这个怎么没用?
 
2008-08-29 09:43 回复 | 引用 | 编辑 | Top

Re: [CF Skills]如何在预定的时间运行你的程序

第11楼
2009-02-10
男
职务:普通
积分:13
等级: 初级程序员一级
金钱: 0
精华: 0
帖子数:5
发帖数前500位(465)

好东西。。。
 
2009-02-11 15:05 回复 | 引用 | 编辑 | Top



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