Проверьте системное время в приложении 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
}
}

Любые советы будут высоко ценится. Я надеюсь, что этот пост не был слишком запутанным в его макете, поскольку я хотел предоставить как можно больше, чтобы показать, что я не просто задаю вопросы, не пытаясь исправить это самостоятельно.

1

Решение

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

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

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

0

Другие решения

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

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

0

По вопросам рекламы [email protected]