博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CF Skills]如何在预定的时间运行你的程序
阅读量:7210 次
发布时间:2019-06-29

本文共 1904 字,大约阅读时间需要 6 分钟。

如何在预定的时间运行应用程序呢?就比如一个自定义的闹钟程序。如何在.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://xprum.baihongyu.com/

你可能感兴趣的文章
EOS和MATRIX共识机制对比
查看>>
苹果将iOS应用带入macOS
查看>>
官宣!微软宣布桌面版 Edge将基于Chromium进行开发\n
查看>>
如何学JavaScript
查看>>
挖财架构师:不能从会计角度设计记账App
查看>>
C# 7.3新特性一览
查看>>
.NET Core 2.1 Preview 2带来网络方面的改进
查看>>
又拍云,音视频CDN加速利器
查看>>
Bitbucket Pipelines在Atlassian的Bitbucket云上提供持续交付功能
查看>>
Python数据可视化的10种技能
查看>>
一地鸡毛 OR 绝地反击,2019年区块链发展指南
查看>>
Kafka团队修改KSQL开源许可,怒怼云厂商
查看>>
今夏发布的Terraform 0.12将提供for循环和第一类表达式
查看>>
GitHub使用Electron重写桌面客户端
查看>>
Microsoft发布Azure Data Factory v2可视化工具的公开预览版
查看>>
周下载量过200万的npm包被注入恶意代码,Vue、Node项目恐受影响
查看>>
九大最热门的IT岗位,机器学习竟然不是第一
查看>>
Stack Overflow技术报告给开发者哪些启示
查看>>
Vue.js 由 1 到 2 的旅程 - (2)
查看>>
麻省理工学院研究人员设计出针对幽灵党和熔毁的DAWG方法
查看>>