在下想通过定时器实现这样一个功能,
将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;
}

解决方案 »

  1.   

    定时器有个windows内核对象,SetWaitableTimer你不妨从这里拓展一下思路。
      

  2.   

    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; //时间到
    }
    //这样行不?
      

  3.   

    添加WM_TIMER消息,SetTimer(1,1000,NULL)表示ID为1的定时器1000MS触发一次OnTmer()函数。
    KillTimer(ID);销毁定时器
      

  4.   

    do
    {
    if(file2.GetLength()>FileLength)
    {
    flag=1;
    FileLength=file2.GetLength();
    KillTimer( TIMER );
    }
    else  
    flag=0;
    }while(flag==0&&没有WM_TIMER消息);
    这段代码仿佛存在很大的问题,会让程序死掉啊!!
    我不知道应该怎样去修改……,意图就是要循环检测 file2 文件有没有变化。
    忘高手指点
      

  5.   

    对文件监控应该开一个新的线程,在里面用自定义事件监控。
    http://www.codeproject.com/KB/files/filewatch.aspx
      

  6.   

    定时器本身就是一个无限循环执行的啊,如果你不kill的话。。直接在定时器响应函数里写你想做的不就好了? 要延迟执行就sleep。不要执行了就kill。。
      

  7.   


    如果这是全部代码的话,那你这个代码确实有很多问题:
    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是否被改写不是很容易,为什么要折腾呢
      

  8.   

    http://blog.csdn.net/jax_lee/article/details/6775030看看这个。。之前我也遇到定时器的问题。