Проверьте системное время в приложении MFC Dialog 24/7

Я пытаюсь заставить мою программу проверять системное время 24/7 в цикле в диалоговом приложении MFC.

немного предыстории того, что я сделал до сих пор.

В моем графическом интерфейсе есть несколько кнопок:- Пуск, Стоп, Выход и несколько полей редактирования для отображения значений.

Он предназначен для чтения в файл.txt в заранее определенном месте 24/7 с заданным интервалом времени пользователем. Это может составлять от 5 минут до любого желаемого пользователем значения, но оно должно быть кратно 5. Например, 5 минут, 10 минут, 15 минут, 20 минут и так далее, и так далее.

После прочтения файла.txt он сравнивает строки в файле.txt и выводит их в файл.csv.

Вот краткое объяснение того, что я пытаюсь сделать. Теперь перейдем к рассматриваемому вопросу.

Поскольку мне нужно, чтобы программа работала 24/7, я пытаюсь заставить программу последовательно проверять системное время и запускать набор функций, когда интервал времени, указанный пользователем, достигнут.

Для этого я сделал переменную всякий раз, когда нажимается кнопка запуска

BOOL start_flag = true;

и start_flag вернется к ложному только после нажатия кнопки остановки

а потом у меня это было в то время как цикл

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);

}

//////// Таймер_Вторичная функция //////////

{
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 программа застревает в бесконечном цикле, и графический интерфейс пользователя зависает из-за этого, и пользователь не сможет остановить его.

У меня в голове есть несколько вещей, но я не уверен, что это сработает.

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 ответа

Решение

Пока ты в своем while петля, насос сообщений Windows не обрабатывает, поэтому ваш пользовательский интерфейс зависает. У меня есть 2 варианта, на мой взгляд:

1) Используйте фоновый поток, чтобы сделать это.

2) расследовать CWnd::SetTimer и использовать это, чтобы выполнить время. Это отправит сообщение в очередь сообщений через заданные вами интервалы (это не решение в реальном времени, но я не думаю, что у вас есть это требование), и, следовательно, ваш интерфейс останется живым.

Добавьте таймер в свой диалог и обработайте сообщение WM_TIMER.

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

Другие вопросы по тегам