2014-01-08 58 views
1

我正在試圖讓我的程序在mfc對話框應用程序的循環中24/7全天候檢查系統時間。在MFC對話框應用程序中檢查系統時間24/7

對我到目前爲止所做的一點背景。

我的GUI有幾個按鈕: - 啓動,停止,退出和一些編輯框來顯示值。

它意味着在用戶指定的間隔時間在預定位置24/7讀入.txt文件。這可能是用戶想要的5分鐘,但它必須是5的倍數。例如,5分鐘,10分鐘,15分鐘,20分鐘等等。

讀取.txt文件後,它將比較.txt文件中的字符串並將其輸出到.csv文件。

這就是我想要做的簡短的解釋。現在談談這個問題。

由於我需要程序全天候運行,我試圖讓程序一致地檢查系統時間,並在用戶指定的間隔時間到達時觸發一組函數。

爲此,我提出只要按下啓動按鈕

BOOL start_flag = true; 

一個變量,一旦停止按鈕被按下

的start_flag只會返回false,然後我有它在一段時間迴路

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循環中,但windows消息泵沒有處理,ergo--你的用戶界面凍結了。你有2個選項,因爲我看到它:

1)使用後臺線程來做到這一點。

2)調查CWnd::SetTimer並使用它來執行計時。這將按照您指定的時間間隔向消息隊列發送消息(它是而不是的實時解決方案,但我認爲您沒有這個要求),因此您的界面將保持活動狀態。

+0

非常感謝您的評論。我設法讓工作時間使用工作線程。爲我節省了大量的時間! :p –

相關問題