2014-01-08 2 views
1

Я пытаюсь проверить свою программу на системное время 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 
} 
} 

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

ответ

0

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

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

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

+0

Большое спасибо за ваш комментарий. Ive удалось сделать время работать, используя рабочий поток. это сэкономило мне много времени! :п –

Смежные вопросы