如何优化 win32 SDK Api

0uhuang 2005-04-11 04:25:55
准备做一个如下功能的程序:程序后台运行,在固定时间(比如12:30)用MessageBox弹个对话框,如此而已。我的思路有两个:
1、用Timer,以一定频率GetLocalTime,判断是否是12:30分,是的话就MessageBox。
2、用do while(1)循环,循环中Sleep一定的时间,再GetLocalTime,再判断,再MessageBox。
感觉两种方法都不够节省资源,不知各位大侠有什么高招可以优化一下,以节省CPU或内存。
比如:1、有没有现成的或相关的API可以调用?
2、程序优先级设置为哪个级别比较合适?等等。

希望大家能不吝笔墨,阐述得详尽点。谢谢!
...全文
222 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
0uhuang 2005-04-11
  • 打赏
  • 举报
回复
用线程的话,也可以有很多实现方法的,各位有什么高招呢?最好分析一下。
wshcdr 2005-04-11
  • 打赏
  • 举报
回复
用线程吧

稍微复杂点、

用while + sleep 简单, 对CPU的影响也不是特别大吧

0uhuang 2005-04-11
  • 打赏
  • 举报
回复
^_^ 你要给分我哦,开玩笑拉。API SetPriorityClass
Featured 2005-04-11
  • 打赏
  • 举报
回复
还有,你怎么调整Process的优先级?
是用CreateProcess的DWORD fdwCreate参数吗?
0uhuang 2005-04-11
  • 打赏
  • 举报
回复
哦 了解了。
Featured 2005-04-11
  • 打赏
  • 举报
回复
你试了就知道了,会造成无法接收键盘鼠标事件

其实Windows的同步机制,比如WaitForSingleObject 之类,都类似于sleep;
设计目的就不是用于主线程的。(而是用于工作线程的)
0uhuang 2005-04-11
  • 打赏
  • 举报
回复
to Featured((【我握着爱情的门票静静排队……】))
好,又是一个创新点。你提到“Sleep不能用于主线程”,我有疑问:倘若Process是最高优先级的,那么,在主线程中也不能用Sleep吗?
Featured 2005-04-11
  • 打赏
  • 举报
回复

可以采用折线精度的算法
比如计算出距离12:00还有3:06:05,那么首先定义一个3小时的定时器,然后定义一个6min的定时器,……

sleep其实很少占用cpu的,不过会挂起当前线程(注意:不是进程!上面那位朋友估计是笔误),
因此不能把它用于主线程。
应该另外开一个线程。

0uhuang 2005-04-11
  • 打赏
  • 举报
回复
首先感谢大家的回答。我想具体问题具体分析,Timer大部分情况下比Sleep好用,又方便精度也比低优先级的Sleep高,但是对一个功能如此简单的程序,Sleep比Timer占用的cpu要少的。(个人经验感觉,没有权威根据)。
to nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急) :
你的方法虽然有缺陷,Sleep在长时间sleep后获得cpu是无法保证,尤其是在低优先级的情况下,所以精度会比较差,但是创意实在不错,很只得学习,借鉴。
另外: to pcboyxhy(-273.15℃): 你的“windows xp里面有一个关机命令”要表达的是什么,十分抱歉我不理解你的意思。


问题还不明朗,希望大家能够再多出些有创新的方法,不用局限于Sleep与Timer的孰优孰劣。
baojian88888 2005-04-11
  • 打赏
  • 举报
回复
用 Timer 更好,不要用 sleep
我的女神 2005-04-11
  • 打赏
  • 举报
回复
我认为Timer好些.
pcboyxhy 2005-04-11
  • 打赏
  • 举报
回复
windows xp里面有一个
关机命令
比如

shutdown -f -s -t 3000

执行后出现关机倒计时
但是只要把系统时间往前改一下(比如10个小时)
这个关机倒计时就自动增加相应的时间
我猜这个是用 GetLocalTime 实现的
zengwujun 2005-04-11
  • 打赏
  • 举报
回复
支持Timer
qqfig 2005-04-11
  • 打赏
  • 举报
回复
呵呵!!!
楼上好注意!!!
nodummy 2005-04-11
  • 打赏
  • 举报
回复
楼住的要求也就限于精确到分而已……大概差那么一两秒没什么问题吧?

直接用GetLocalTime获取时间,然后算好下次什么时候MessageBox,然后把时间传递给Sleep函数就可以了……

24*3600*1000还是小于~0的,所以这样基本上没有什么不安全的问题……
纪俊 2005-04-11
  • 打赏
  • 举报
回复
我觉得可以基本不考虑优先级
如果当前程序占用资源很大就用多线程实现
pcboyxhy 2005-04-11
  • 打赏
  • 举报
回复
优先级看你精度要求了
一般普通就可以了
低一些也不要紧
纪俊 2005-04-11
  • 打赏
  • 举报
回复
Sleep一定的时间-在这个时间里边如果是单一线程的话当前进程就被挂起了,也就是说无法向下执行其他命令了
chunhai12 2005-04-11
  • 打赏
  • 举报
回复
就是闹钟嘛,网上有很多源码,楼主去下一个研究一下
0uhuang 2005-04-11
  • 打赏
  • 举报
回复
to blow_jj(阿俊):
Timer 比do while 如何好法?请再多谈一点。
加载更多回复(1)

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧