难题!MFC计时器问题!加急!

vcminusminus 2009-09-23 09:37:19
关于如何确保一个成员函数每隔一定时间就执行一次的问题,这个不是简单的SetTimer问题。
需求是这样的:

1.程序要求每隔15秒读取一次数据。实际是该时间间隔必须在10秒与20秒之间,取了中间的15;
2.将读取的数据写入新文件中,并根据读取的时间作为文件名。将该文件名保存到表中,用于在步骤3中调用;
3.从表中读取新生成的数据文件名称,打开文件,将该文件内容按一定的规则进行处理。

以上1、2、3是完成一次处理所需的流程顺序。要求对读取到的数据的后续的处理不能影响每隔15秒读一次数据,也就是说,无论后续数据处理怎么耗时,都必须确保每隔15秒读取一次数据,最迟不能超过20秒(15秒内肯定能把数据读完并保存到新文件中,这不是问题)。
关键是第三步对新文件的处理非常复杂,是个while循环,导致非常耗时。请朋友们不要关注怎样改进文件处理规则来提高处理时间,规则是固定的,不能改,每次处理至少5分钟才能完成。所以问题由此而来,怎么样让数据处理不干扰数据读取,也就是说把这两个过程独立起来,各执行各的。

已采取的方案有:
方案1:使用计时器。创建两个计时器,计时器1用于读数据,时间间隔为15秒;计时器2用于处理数据,时间间隔为7分钟。
该方案的问题是当处理数据时while循环会导致程序的窗口点击无法响应,象死机一样,同样也导致计时器1发出的WM_TIMER消息被阻塞,即整个处理数据期间根本无法读取数据,导致读取数据严重超时。

方案2:只创建一个计时器,用于处理数据。而读取数据则使用COleDateTime类与COleDateTimeSpan类结合while循环来计时。例如:

while(bIsOK) //bIsOK用于控制循环退出
{
//设定循环时间间隔为15秒
int nInterval = 15
//开始时间,用于计算延时
COleDateTime tStart = COleDateTime::GetCurrentTime();

//开始读数据
ReadData();

//计算耗时
COleDateTimeSpan tsSecond = COleDateTime::GetCurrentTime() - tStart;
int nSeconds = tsSecond.GetTotalSeconds();
//开始延时。只要从读数据开始到现在未达到15秒就延时,直到达到15秒再退出延时,
while(bIsOK && nSeconds < nInterval)
{
//计算剩余的延迟时间
tsSecond = COleDateTime::GetCurrentTime() - tStart;
nSeconds = tsSecond.GetTotalSeconds();
//每2秒进行一次消息循环,否则窗口无法响应用户操作。
if(nSeconds%2 == 0 && ::GetMessage(&msg,NULL,0,0))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
}


该方案的问题是:因为在延时中加入了消息处理,而有的消息处理会耗费时间,所以延时经常不准确。不加消息处理时延时是非常精确的,但不加消息处理时程序窗口无法响应,象死机了一样。

问题就是这样了,请朋友们帮忙解决一下。尽量不要创建线程以在线程中进行数据处理。我希望能使用一种办法确保无论系统多么繁忙或被阻塞,总能保证每隔15秒执行一次读数据的成员函数。
...全文
1479 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyson 2011-07-29
  • 打赏
  • 举报
回复
刚开始学多线程,计时器等一堆东西。。好难啊。。
ah_one_dream_wh 2010-10-06
  • 打赏
  • 举报
回复
来晚了。。。。。学习。。。顶。。。。up..up

我正在使用《Csdn收音机》第一时间获取最新动态!
lookingfor1 2010-10-06
  • 打赏
  • 举报
回复
原来如此
www_OK2002_com 2010-04-01
  • 打赏
  • 举报
回复
top~!!!!
vcminusminus 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fishion 的回复:]
等待定时器内核对象
CreateWaitableTimer
SetWaitableTimer
[/Quote]
谢谢这位朋友提供的CreateWaitableTimer,暂时没有采用,以后会好好研究一下。
感谢参与的各位热心的朋友们!
另外,要特别感谢一下钻石cnzdgs,您的参与让这个帖子蓬荜生辉!
fishion 2009-09-24
  • 打赏
  • 举报
回复
等待定时器内核对象
CreateWaitableTimer
SetWaitableTimer
fandh 2009-09-24
  • 打赏
  • 举报
回复
你这个应该用简单的多线程技术应该就可以了吧!
下面是多线程简单用例,你看一下,不难!
http://download.csdn.net/source/1123495
当然,多线程用的复杂了,还是比较难的!
发现心流 2009-09-24
  • 打赏
  • 举报
回复
必须多线程吧
楼主的文件操作的耗时是不确定的
timer肯定准不了
cnzdgs 2009-09-23
  • 打赏
  • 举报
回复
用一个定时器间隔15秒读数据,另外开一个(或多个)线程处理数据。
zqlong_sunday 2009-09-23
  • 打赏
  • 举报
回复
这样的问题,只能用多线程了
Conry 2009-09-23
  • 打赏
  • 举报
回复
启动两个线程1个每隔15秒读取数据,另一个做处理
jspkiss 2009-09-23
  • 打赏
  • 举报
回复
多线程,用多线程可以完美解决这个问题
贝隆 2009-09-23
  • 打赏
  • 举报
回复
学习!顶!
cphj 2009-09-23
  • 打赏
  • 举报
回复
方案2可以解决问题啊,延时虽然不准确,但应该不会超过20秒吧,实在不行可以把nInterval改小点

如果不引入多线程就只能这样了,而且就算引入多线程也不能做到完全精确,因为windows毕竟不是实时操作系统
rayw0ng 2009-09-23
  • 打赏
  • 举报
回复
数据处理放到OnIdle中。
stjay 2009-09-23
  • 打赏
  • 举报
回复
使用多线程,这个难题就不难了
难道没制定这个方案?

别执着MFC,消息机制
NewJerryj 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tr0j4n 的回复:]
用多线程,必须的。

你这样肯定会造成主线程出问题,你的界面无响应就是这个原因
[/Quote]

严重同意,多线程编程是一门艺术,掌握好了那就可以写出系统级的软件。
MoXiaoRab 2009-09-23
  • 打赏
  • 举报
回复
用多线程,必须的。

你这样肯定会造成主线程出问题,你的界面无响应就是这个原因

16,473

社区成员

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

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

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