2013-03-06 138 views
0

我用C++編寫了一個程序來完成某些任務。用戶選擇將完成哪些。首先,程序會對用戶選擇的全部內容進行處理,然後等待用戶指定的時間(以秒爲單位)再次執行某個任務;任務可以有不同的等待時間。定時器不能正常工作的C++程序

在我的電腦裏它工作的很好,但是我把可執行文件給了某人,他告訴我他第一次做了他選擇的任務(他只是選擇了任務3),但是在等待時間之後結束了,它什麼都沒做。我不知道問題的根源,它與我使用的相同的.exe文件,在我的電腦中工作正常,行爲應該是相同的,但由於某種原因,它不是。

我使用了msvc 2012.而且,用戶擁有Visual C++ Redistributable。

#include "stdafx.h" 
#include <Windows.h> 
#include <iostream> 

using namespace std; 

int GetLowestWaitingTime(int* a) 

int main() 
{ 
    int WaitingTime[3]; 
    int TimeForTask[3]; 
    bool task[3]; 
    int i; 

    cout<<"1=yes 0=no. Press enter after you have typed the chosen number" <<endl; 

    for(i = 0; i < 3;i++){ 
     cout<<"Do you want task " <<i+1 <<" to be performed? "; 
     cin >> task[i]; 

     if(task[i]) 
     { 
      cout<<"Enter the waiting time for task " <<i+1 <<" in seconds: "; 
      cin >> TimeForTask[i]; 
     }else{ 
      TimeForTask[i] = -1; 
     } 

     WaitingTime[i] = 0; 
    } 



    while(1) 
    { 
     for(i = 0; i < 3; i++){ 
      if(task[i] && WaitingTime[i] == 0) 
      { 
       //Do task i+1 
       WaitingTime[i] = TimeForTask[i]; 
      } 
     } 

     SleepTime = GetLowestWaitingTime(WaitingTime); 
     SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2); //turn off monitor 
     Sleep(SleepTime*1000); 

     for(i = 0; i < 3; i++) 
     { 
      if(WaitingTime[i] != -1){ 
       WaitingTime[i] -= SleepTime; 
      } 
     } 
    } 

    return 0; 
} 

int GetLowestWaitingTime(int* a) 
{ 
    int l = -2; 

    if(a[0] != -1 && ((a[0] < a[1]) || (a[1] == -1))){ 
     l = a[0]; 
    }else if(a[1] != -1){ 
     l = a[1]; 
    } 

    if(l == -2){l = a[2];}else if(l > a[2] && a[2] != -1){l = a[2];} 

    return l; 
} 
+0

你有一段時間(1),你似乎沒有打出來的。 SendMessage()是否這樣做?否則,你將永遠停留在while循環中。 – wolfPack88 2013-03-06 21:07:52

+0

它可能掛在那個SendMessage上。我不認爲它真的做你打算做的事情。 – 2013-03-06 21:51:43

回答

0

您將每個索引的WaitingTime設置爲0,但您的標記爲-1,因此您將永遠爲SleepTime獲取0。

嘗試使用while循環如下:

while(1) 
{ 
    for(i = 0; i < 3; i++){ 
     if(task[i] && WaitingTime[i] == 0) 
     { 
      //Do task i+1 
      WaitingTime[i] = TimeForTask[i]; 
     } 
     else 
     { 
      WaitingTime[i] = -1; 
     } 
    } 

    SleepTime = GetLowestWaitingTime(WaitingTime); 
    SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2); //turn off monitor 
    Sleep(SleepTime*1000); 

    for(i = 0; i < 3; i++) 
    { 
     if(WaitingTime[i] != -1){ 
      WaitingTime[i] -= SleepTime; 
     } 
    } 
}