在MFC Dialog Application 24/7中检查系统时间

时间:2014-01-08 10:11:57

标签: c++ mfc systemtime

我正在尝试让我的程序在mfc对话框应用程序中循环检查系统时间24/7。

关于我到目前为止所做的一些背景。

我的GUI有几个按钮: - 启动,停止,退出和一些显示值的编辑框。

意味着用户在指定的间隔时间24/7读取预定位置的.txt文件。这可能是5分钟到用户想要的长度,但它必须是5的倍数。例如,5分钟,10分钟,15分钟,20分钟等等。

读完.txt文件后,它会比较.txt文件中的字符串并输出到.csv文件。

这就是我想要做的事情的简要说明。现在回答手头的问题。

由于我需要程序全天候运行,我试图让程序一致地检查系统时间,并在达到用户指定的间隔时间时触发一组功能。

为此,每当按下开始按钮时我都会创建一个变量

BOOL start_flag = true;

并且一旦按下停止按钮,start_flag将仅返回false

然后我在while循环中使用它

while (start_flag)
{
    Timer();                    // To add the user entered interval time to current time 
    Timer_Secondary();          // To compare the converted time against the current time
    Read_Log();                 // Read the logs
}

///////////////////计时器功能//////////////////////

{
CTime curTime = CTime::GetCurrentTime();

timeString_Hour = curTime.Format("%H");
timeString_Minute = curTime.Format("%M");
timeString_Second = curTime.Format("%S");
Hour = atoi(timeString_Hour);
Minute = atoi(timeString_Minute);
Second = atoi(timeString_Second);

if ((first_run == false) && (Int_Frequency < 60))
{
    int Minute_Add = Minute + Int_Frequency; 
    if (Minute_Add >= 60)
    {
        Minute_Add = Minute_Add - 60;
        Hour = Hour + 1;
    }
    Minute = Minute_Add;
}

if ((first_run == false) && (Int_Frequency >= 60))
{
    int Local_Frequency = Int_Frequency;     
    while (Local_Frequency >= 60)
    {
        Local_Frequency = Local_Frequency - 60;
        Hour = Hour + 1;
    }
}

if (first_run)
{
    Hour = Hour + 1;
    Minute = 00;
    Second = 00;
    first_run = false;
}

timeString_Hour.Format("%d", Hour);
timeString_Minute.Format("%d", Minute);
timeString_Second.Format("%d", Second);

}

//////// Timer_Secondary function //////////

{
CTime curTime = CTime::GetCurrentTime();

timeString_Hour_Secondary = curTime.Format("%H");
timeString_Minute_Secondary = curTime.Format("%M");
timeString_Second_Secondary = curTime.Format("%S");
Hour_Secondary = atoi(timeString_Hour);
Minute_Secondary = atoi(timeString_Minute);
Second_Secondary = atoi(timeString_Second);

}

是的,我到目前为止的问题是,由于while循环,程序陷入无限循环,GUI因此而冻结,用户无法使其停止。

我脑子里想到了一些东西,但我不确定它是否会起作用。

while (start_flag)
{
if((Hour_Secondary == Hour) && (Minute_Secondary == Minute) && (Second_Secondary == Second))
{
    // Run parsing function in this (main bit of code)
    start_flag = false;  //Set it to false so it will jump back out of this loop
}
if ((Hour_Secondary != Hour) && (Minute_Secondary != Minute) && (Second_Secondary != Second))
{
    // Some form of time function in this to wait every 1 min then loop back to start of while loop)
    // With the timer function, the GUI should be usable at this point of time
}
}

非常感谢任何建议。我希望这篇文章在布局上不会太混乱,因为我想提供尽可能多的东西来证明我不仅仅是在不试图自己解决问题的情况下提出问题。

2 个答案:

答案 0 :(得分:0)

当您处于while循环中时,Windows消息泵未处理,因此您的用户界面会冻结。我有两种选择:

1)使用后台线程来执行此操作。

2)调查CWnd::SetTimer并使用它来执行计时。这将按照您指定的时间间隔将消息发布到消息队列中(它不是不是实时解决方案,但我认为您没有这个要求),因此您的界面将保持活动状态

答案 1 :(得分:0)

在对话框中添加计时器控件并处理WM_TIMER消息。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644901(v=vs.85).aspx#creating_timer