我为一个对话框添加了WM_TIMER消息函数,并在OnInitDialog() 函数中添加SetTimer(1,10000,NULL);该对话框有两个成员变量分别为
m_time和m_prompt的编辑框
现在我要这个程序每10秒把文本的时间数据与系统时间进行匹配,当时间相等时候就弹出这个对话框,并把文本的时间给m_time,把提示内容
给m_prompt。为什么当程序开始运行10秒后如果文本的时间与系统时间一样的时候,对话框正常显示内容并且对话框是可用的,而当10秒后如果找不到与系统匹配的时间我的对话框变成不可用了呢?但是当找到下一个时间与系统匹配我的对话框又正常显示并可用的。
我文档数据的格式是:
2008-10-16 11:15 asdfghjlk
2008-10-16 11:17 weweweqet
2008-10-16 09:24 gfhhfghg
2008-10-16 09:18 fghfghhhh
2009-07-03 09:51 fghfghtrhr
当系统时间是2008-10-16 11:15时,对话框正常显示内容并可用,而到了2008-10-16 11:16时对话框不可用但是仍然运行,当2008-10-16 11:15时对话框又回复正常了,请问时什么原因呢??下面是代码,请帮忙看看。谢谢
class memo
{
public:
    char date[15];
    char time[10];
    char event[200];
};
void CPrompt::OnTimer(UINT nIDEvent) 
{ // TODO: Add your message handler code here and/or call default
int k;
CPrompt pro;
COleDateTime system_time, file_time;
CTime tNow;
 UpdateData(TRUE); 
int i=0;
fstream file2;
file2.open("C:\\Documents and Settings\\All Users\\Documents\\memo.txt",ios::in);
    memo prompt[50];
if(!file2)
{
        abort();//中断函数
}
while(!file2.eof())
//判断是否到文件结尾
{file2>>prompt[i].date>>prompt[i].time>>prompt[i].event;
                  i++;
}
k=i;
while(k>0)//循环检查文本,当第一次读到未尾后从头开始读
{
for(int j=0;j<i;j++)  
  {
CString m_Str1 = prompt[j].date;
    m_Str1+=" ";
    m_Str1+=prompt[j].time;
    file_time.ParseDateTime(m_Str1);
char buf[30] = {0}; 
time_t timep; 
struct tm *p; 
time(&timep); 
p=gmtime(&timep);  
tNow=CTime::GetCurrentTime();
strftime(buf, 30, "%Y-%m-%d", p);
CString m_Str2=buf;//获取日期
m_Str2+=" ";
m_Str2+=tNow.Format("%H:%M");
 system_time.ParseDateTime(m_Str2);
if(system_time==file_time)
{  ShowWindow(SW_RESTORE) ;//当时间到时恢复原来窗口大小
    sndPlaySound("f:\\a.wav",SND_ASYNC|SND_LOOP);//循环播放声音。
m_time=prompt[j].date;
m_time+=" ";
m_time+=prompt[j].time;
m_prompt=prompt[j].event;
    UpdateData(FALSE);//更新提示内容
k--;

}
}
 } file2.close();
UpdateData(FALSE);
}

解决方案 »

  1.   

    CPrompt pro; //干嘛?
    ShowWindow(SW_RESTORE) ;//干嘛?
      

  2.   

    类CPrompt就是我这个对话框,这些不用管,程序太长没法全部说明,就是为什么当10秒后如果找不到匹配的时间的话对话框就不能用。
      

  3.   

    崩溃。。你在timer里写这么多东西
      

  4.   

    if(system_time==file_time) 
    {  ShowWindow(SW_RESTORE) ;//当时间到时恢复原来窗口大小 
        sndPlaySound("f:\\a.wav",SND_ASYNC|SND_LOOP);//循环播放声音。 
    m_time=prompt[j].date; 
    m_time+=" "; 
    m_time+=prompt[j].time; 
    m_prompt=prompt[j].event; 
        UpdateData(FALSE);//更新提示内容 
    k--; }
    =============================
    如果系统时间和文件内时间不一致,那么将永远循环下去,因为一直都不会执行k--。
      

  5.   

    for(......)
    {
    }
    后应该加个k--
      

  6.   

    for(......)
    {
    }
    后应该加个k--
      

  7.   

    这些不放在timer里面应该放哪里啊?
    能不能说点有参考价值的建议啊
      

  8.   

    我知道哪里错了,把while(k>0)去掉就可以了
    很感谢scenqion最后一句话“如果系统时间和文件内时间不一致,那么将永远循环下去,因为一直都不会执行k--。”
    准备接分