定时器使用的一些小问题

ouyangzhongwen 2011-09-14 10:40:51
在下想通过定时器实现这样一个功能,
将buffer中的数据写入文件file1.txt中( 假设这个操作可能会引起file2.txt的变化 ),接着监视file2.txt到底有没有变化。
1)、在 1 s 内 file2.txt没有变化,则将buffer内容再次写入文件。
2)、在 1 s 内 file2.txt有变化,则停止计时。

现在我的问题是:
1)、如何能够直接捕捉到WM_TIMER消息,在程序尾部下划线部分如何写代码呢?

2)、当程序在响应WM_TIMER时,会同时继续执行当前函数吗?
int CARQDlg::SendBuffer()
{
CFile file1,file2;
file1.Open("file1.txt",CFile::modeCreate | CFile::modeWrite );
file1.Write(buffer); //发送数据
SetTime(TIMER,1000,0); //设置定时器
file2.Open("file2.txt",CFile::modeCreat | CFile::modeRead );
int FileLength=0; //存file2文件上一次长度
int flag; //文件长度比较标志
do
{
if(file2.GetLength()>FileLength)
{
flag=1;
FileLength=file2.GetLength();
KillTimer( TIMER );
}
else
flag=0;
}while(flag==0&&没有WM_TIMER消息);
return flag;
}
...全文
148 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jax_lee 2011-09-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/jax_lee/article/details/6775030

看看这个。。之前我也遇到定时器的问题。
明寿 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ouyangzhongwen 的回复:]
do
{
if(file2.GetLength()>FileLength)
{
flag=1;
FileLength=file2.GetLength();
KillTimer( TIMER );
}
else
flag=0;
}while(flag==0&&没有WM_TIMER消息);
这段代码仿佛存在很大的问题,会让程序死掉啊!!
我不知道应该怎样去修……
[/Quote]

如果这是全部代码的话,那你这个代码确实有很多问题:
1,file open以后都没有close.
2,file1.Write(buffer)是延迟写入的,如果没有close,有可能没有写入文件。
3,file open以后如果没有close, 其它进程是无法对其修改的。因此if(file2.GetLength()>FileLength)不会成真。

//看这样行不:
public: BOOL TimeOver;

int CARQDlg::SendBuffer()
{
CFile file1,file2;
file1.Open("file1.txt",CFile::modeCreate | CFile::modeWrite );
file1.Write(buffer); //发送数据
file1.Close();
SetTime(TIMER,1000,0); //设置定时器
TimeOver = FALSE;
file2.Open("file2.txt",CFile::modeCreat | CFile::modeRead );
int OldLength=file2.GetLength(); //存file2文件上一次长度
file2.Close();
int flag; //文件长度比较标志
do
{
DoEvents(); //这个代码网上有:
//Delay(100); //这里最好加入延时ms,循环执行DoEvents();
//要考虑给其它进程写file2的时间
file2.Open("file2.txt",CFile::modeCreat | CFile::modeRead );
int NewLength=file2.GetLength(); //新长度
file2.Close();

if(NewLength > OldLength)
{
flag=1;
OldLength = NewLength;
KillTimer( TIMER );
}
else
flag=0;
}while(flag==0&& TimeOver == FALSE);
return flag;
}

int CARQDlg::OnTimer(UINT nIDEvent)
{
TimeOver = TRUE; //时间到
}

//上面代码要考虑当file2被其它进程打开而没关闭时,那么就会报错的。
//不明白你这个程序为什么要这样写,如果SendBuffer()只写file1, OnTimer()中判断file2是否被改写不是很容易,为什么要折腾呢
qjzl2008 2011-09-15
  • 打赏
  • 举报
回复
定时器本身就是一个无限循环执行的啊,如果你不kill的话。。

直接在定时器响应函数里写你想做的不就好了? 要延迟执行就sleep。不要执行了就kill。。
诶呦 2011-09-15
  • 打赏
  • 举报
回复
响应定时器函数,当前程序依然执行
诶呦 2011-09-15
  • 打赏
  • 举报
回复
添加WM_TIMER消息,SetTimer(1,1000,NULL)表示ID为1的定时器1000MS触发一次OnTmer()函数。
KillTimer(ID);销毁定时器
明寿 2011-09-15
  • 打赏
  • 举报
回复
public: BOOL TimeOver;

int CARQDlg::SendBuffer()
{
CFile file1,file2;
file1.Open("file1.txt",CFile::modeCreate | CFile::modeWrite );
file1.Write(buffer); //发送数据
SetTime(TIMER,1000,0); //设置定时器
TimeOver = FALSE;file2.Open("file2.txt",CFile::modeCreat | CFile::modeRead );
int FileLength=0; //存file2文件上一次长度
int flag; //文件长度比较标志
do
{
DoEvents();//这个代码网上有
if(file2.GetLength()>FileLength)
{
flag=1;
FileLength=file2.GetLength();
KillTimer( TIMER );
}
else
flag=0;
}while(flag==0&& TimeOver == FALSE);
return flag;
}

int CARQDlg::OnTimer(UINT nIDEvent)
{
TimeOver = TRUE; //时间到
}


//这样行不?
fyzh84 2011-09-15
  • 打赏
  • 举报
回复
定时器有个windows内核对象,SetWaitableTimer你不妨从这里拓展一下思路。
buyong 2011-09-15
  • 打赏
  • 举报
回复
对文件监控应该开一个新的线程,在里面用自定义事件监控。
http://www.codeproject.com/KB/files/filewatch.aspx
ouyangzhongwen 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wlxu1209 的回复:]
public: BOOL TimeOver;

int CARQDlg::SendBuffer()
{
CFile file1,file2;
file1.Open("file1.txt",CFile::modeCreate | CFile::modeWrite );
file1.Write(buffer); //发送数据
SetTime(TIMER,1000,0); //设置定时器
……
[/Quote]

好像运行时,在循环查询文件的时候,依旧是一个死循环。
希望再给我支一招啊,谢谢啊…………
ouyangzhongwen 2011-09-15
  • 打赏
  • 举报
回复
do
{
if(file2.GetLength()>FileLength)
{
flag=1;
FileLength=file2.GetLength();
KillTimer( TIMER );
}
else
flag=0;
}while(flag==0&&没有WM_TIMER消息);
这段代码仿佛存在很大的问题,会让程序死掉啊!!
我不知道应该怎样去修改……,意图就是要循环检测 file2 文件有没有变化。
忘高手指点
zxfwizard 2011-09-15
  • 打赏
  • 举报
回复
开定时器就是多线程

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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