Я пытаюсь проверить свою программу на системное время 24/7 в цикле в приложении диалога mfc.Проверка системного времени в приложении MFC Dialog Application 24/7
немного фона на то, что я сделал до сих пор.
В моем GUI есть несколько кнопок: - запуск, остановка, выход и несколько полей редактирования для отображения значений.
Предназначен для чтения в .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);
}
//////// функция Timer_Secondary //////////
{
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
}
}
Любой совет будет очень признателен. Я надеюсь, что этот пост не слишком сбивает с толку в его макете, поскольку я хотел бы предоставить как можно больше, чтобы показать, что я не просто задаю вопросы, не пытаясь сначала исправить это.
Большое спасибо за ваш комментарий. Ive удалось сделать время работать, используя рабочий поток. это сэкономило мне много времени! :п –