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

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

BOOL CeRunAppAtTime(

 TCHAR* pwszAppName,

 SYSTEMTIME* lpTime

}

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

        publicstaticvoid 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 = newSystemTime();

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

            FileTimeToSystemTime(ref localFileStartTime, systemStartTime);

            CeRunAppAtTime(s, systemStartTime);

        }

#region invoke methods

        [DllImport("CoreDLL.dll")]

        publicstaticexternint CeRunAppAtTime(string application,

SystemTime startTime);

        [DllImport("CoreDLL.dll")]

        publicstaticexternint FileTimeToSystemTime(reflong lpFileTime,

SystemTime lpSystemTime);

        [DllImport("CoreDLL.dll")]

        publicstaticexternint FileTimeToLocalFileTime(reflong lpFileTime,

reflong lpLocalFileTime);

#endregion

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

            DateTime startTime = DateTime.Now + newTimeSpan(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

完整的代码示例在这里:http://www.winbile.net/bbs/forums/threads/1034915.aspx

posted on 2008-02-03 03:49 Freesc Huang 阅读(2228) 评论(5) 编辑 收藏

评论

#1楼 2008-12-12 15:03 ningjike[未注册用户]

小弟想要一个程序:正在通话的时候,运行一下这个程序就可以结束通话,虽然按挂机键可以结束,但有时想运行这样一个程序来结束通话,试过用自动关机来实现,但出现了电话没有了任何声音的现象。系统是PPC6.0。小弟对编程一点也不懂,在网上找也找不到有这样的程序,大哥能个忙吗?懂编程的应该会很容易做到吧?希望能够帮个忙,万分感激!  回复 引用   

#2楼 2009-06-12 16:56 Jack Fan      

@ningjike
用程序模拟挂机键按下不就得了?
 回复 引用 查看   

#3楼 2009-06-30 20:15 .CPP      

不知道LZ有没有发现这个情况:
SYSTEMTIME在MSDN中说明是个结构体。

可这个例子用P/INVOKE的时候,定义的SYSTEMTIME用的是class。他的结果正常。

现在我有个问题:我把class改成struct即

[StructLayout(LayoutKind.Sequential)]
public struct SystemTime
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMilliseconds;
};

然后
[DllImport("CoreDLL.dll")]
public static extern int FileTimeToSystemTime(ref long lpFileTime,ref SystemTime lpSystemTime);

为什么一直出不来效果?请LZ赐教(我上面两行代码应该没问题吧)
 回复 引用 查看   

#4楼 2010-11-30 15:48 pxeric      

楼主,想请问下,现在我定时运行某一程序已经做好了。但屏幕是关闭的,请问该如何开启屏幕呢。  回复 引用 查看   

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

These postings are provided "AS IS" with no warranties
and confer no rights.


Locations of visitors to this page

Blog Keywords
Embedded System,Visual Studio,.Net Framework,.Net Compact Framework,.Net Micro Framework,Windows Mobile,Windows Embedded CE,Emulator,WCF,CLR,Design & Pattern,C/C++,C#,Matlab,Algorithms
昵称:Freesc Huang
园龄:4年11个月
粉丝:32
关注:4

统计

  • 随笔 - 197
  • 文章 - 0
  • 评论 - 840

搜索

 

随笔分类(227)

随笔档案(197)

Blogs

Link

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜