在下想通过定时器实现这样一个功能,
将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;
}
将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;
}
{
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; //时间到
}//这样行不?
KillTimer(ID);销毁定时器
{
if(file2.GetLength()>FileLength)
{
flag=1;
FileLength=file2.GetLength();
KillTimer( TIMER );
}
else
flag=0;
}while(flag==0&&没有WM_TIMER消息);
这段代码仿佛存在很大的问题,会让程序死掉啊!!
我不知道应该怎样去修改……,意图就是要循环检测 file2 文件有没有变化。
忘高手指点
http://www.codeproject.com/KB/files/filewatch.aspx
如果这是全部代码的话,那你这个代码确实有很多问题:
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是否被改写不是很容易,为什么要折腾呢