定时器操作问题(非多线程)。

yangl79 2004-10-18 10:35:19
在程序中有一记录集,记录数据库的查询结果,并有一记时器,到记时器走满后会关闭记录集(因为人长时间不在,关闭记录集可以节省内存),如果对记录做了操作(读写、删除等),记时器就重新开始记时。

现在的问题是:
假设有一函数要对记录集进行读操作,进入函数的时候,记录集是打开的(记时未到达),于是它开始读取记录集中的数据,如果读的过程中定时器到达,则会在消息队列中放置一个定时器到达的消息,当数据读取
结束后,该函数会重启定时器,这一切还算正常,可是退出该函数的时候会马会上触发OnTimer函数,该函数
会关闭记录集并取消掉定时器,原因就是记时器走满,这样的结果是,虽然对记录集做了读操作,却没有达到
我要的重新开始记时器的目的,请问如何解决这个问题?
我想过在操作数据库的时候KillTimer,可是在KillTimer的过程中,两样可能出现定时器到达的情况,这样队列中还是多了一个定时器到达消息!
目前我想的办法就是在重新启动定时器之前,先看看消息队列中有没有WM_TIMER消息,但我不知道如何遍历消息队列并清除某些消息,请给点代码。
...全文
201 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangl79 2004-10-18
  • 打赏
  • 举报
回复
to DentistryDoctor(雅克医生(潜心修内功))
方法一:while(::PeekMessage(&msg,GetSafeHwnd(),WM_TIMER,WM_TIMER,PM_REMOVE));
PeekMessage会造成OnTimer的调用,这样还是相当于多了一个定时器到达消息,用在我的例子中就是,在对记录集做的操作后,记录集还是关闭了(,因为调用了OnTimer函数,但定时器重启这个要求是达到了)。
方法二:如果在进入KillTimer前定时器到达,出现记录集被关闭,定时器也没有重启(重启后马上又关闭了)。

我认为这个问题应该这样:在SetTimer之前对消息队列进行遍历,看有没有WM_TIMER消息,如果有还有判断定时器ID,如果都符合,就删除掉这条消息,可是我有两个地方不会:
一:不会遍历消息队列,PeekMessage不行,因为它实质是执行消息队列中的消息;
二:不会删除某条消息。
LoveBluck 2004-10-18
  • 打赏
  • 举报
回复
up
flyelf 2004-10-18
  • 打赏
  • 举报
回复
CreateWaitableTimer
获取使用定时器队列
DentistryDoctor 2004-10-18
  • 打赏
  • 举报
回复
In handle function:
KillTimer
Handle
SetTimer?
DentistryDoctor 2004-10-18
  • 打赏
  • 举报
回复
while(::PeekMessage(&msg,GetSafeHwnd(),WM_TIMER,WM_TIMER,PM_REMOVE));
lvgame 2004-10-18
  • 打赏
  • 举报
回复
可不可以这样做:只要有操作就把定时器清零,重新记数.
yangl79 2004-10-18
  • 打赏
  • 举报
回复
to enoloo(在水一方)
你能介绍一下CreateWaitableTimer函数的作用与用法吗?我看了MSDN也没明白?

文件读取完毕时, 用 QS_TIMER 参数的 GetQueueStatus 函数检查队列中是否有记时器通知标志

对于你上面说的,我也考虑过,关键是如果GetQueueStatus函数确定有记时器通知标志时,那由怎么样呢?
关键是怎么删除掉这个通知消息啊!(不然引起OnTimer的调用,那么重新启动的定时器又被取消掉了)
enoloo 2004-10-18
  • 打赏
  • 举报
回复
CreateWaitableTimer,

或者,

文件读取完毕时, 用 QS_TIMER 参数的 GetQueueStatus 函数检查队列中是否有记时器通知标志,

或者

不用计时器, 用系统时间来做标记. 这要冒点风险, 系统时间对其他程序也是公开的.
yo_jo 2004-10-18
  • 打赏
  • 举报
回复
搬个小凳...

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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