2013-02-21 140 views
0

此代碼只能工作一次,即用戶上線並下線。我想循環以便始終提供信息。如:在線11:00,離線11:30,在線11:45,離線12:00。需要邏輯幫助

我該如何解決這個問題?

bool showed =false; 
bool nshowd =false;       
for (; ;) 
{ 
    //chech_online() <- this methods gives true if the person is online on FB 

    bool check_online =check_online();        

    if(check_online ==true && !showed) 
    { 
     Console.WriteLine("Online !!" +DateTime.Now); 
     showed = true; 
    } 
    else if(check_online ==false && !nshowd) 
    { 
     Console.WriteLine("OFFline !!" + DateTime.Now); 
     nshowd = true; 
    } 
} 

回答

0

你可以做一個循環和睡眠10分鐘每次迭代等?

bool toggle = false; 
bool exitloop = false; 
int checkinterval = 600; // time in seconds between check 

while(!exitloop) 
{ 
    bool is_online = check_online();        

    if (is_online) 
    { 
     if (!toggle) 
     { 
      Console.WriteLine("Online!" + DateTime.Now.ToString(); 
      toggle = true; 
     } 
    } 
    else 
    { 
     if (toggle) 
     { 
      Console.WriteLine("Offline!" + DateTime.Now.ToString()); 
      toggle = false; 
     } 
    } 

    Thread.Sleep(checkinterval * 1000); 

    // it would be a good idea to allow a mechanism 
    // to exit from the infinite loop. 
    if (check_if_we_should_exit_loop()) 
    { 
     exitloop = true; 
    } 
} 
+0

仍然不顯示用戶已登錄/關閉_again_,因爲'show' /'nshowd'變量不會被重置 – Nuffin 2013-02-21 09:35:15

+0

請參見更新。邏輯已經改變,沒有必要有兩個不同的布爾值。 – 2013-02-21 09:36:50

+0

謝謝你們:)它幫了我很多。 – John 2013-02-21 10:37:08

2

爲什麼showednshowed的變量不一樣?你不想要一個is_online變量,那麼testif不同於check_online

+1

該解決方案的行爲有所不同,具體取決於用戶在程序啓動時登錄或關閉。如果用戶在線,它顯示'Online !! [程序啓動時間]',否則它不顯示任何內容。爲了保持一致,我會使用一個可空的布爾值來初始化爲null(所以在啓動時每個狀態都不同於初始值);) – Nuffin 2013-02-21 09:39:15

+0

是的,真的 - 很好的地方。我認爲在實踐中,如果程序啓動時他們不在線,他們可能不會在意,但我不確切知道OP需要什麼。 – Rup 2013-02-21 09:44:42

+0

這也是一個很好的方法來區分_something has gone wrong_和_the user is actually offline_,尤其是如果例外情況被默默處理 – Nuffin 2013-02-21 09:47:56

1

由於showednshowd是相互排斥的,有沒有點在維護他們兩個 - 這就是布爾變量的整點:

userShown = false 
while true: 
    userOnline = check_online() 
    if userOnline && !userShown: 
     output "User is online" 
     userShown = true 
    else: 
     if !userOnline && userShown: 
      output "User is offline" 
      userShown = false 
    sleep a bit 

或者,你可以保持過去的狀態和獨顯當它改變時:

isOnline = check_online() 
wasOnline = !isOnline 
while true: 
    if isOnline != wasOnline: 
     output "User is ", (isOnline) ? "online" : "offline" 
     wasOnline = isOnline 
    sleep a bit 
    isOnline = check_online() 

這個特殊的方法保證輸出一個初始消息,不管用戶州。

0
bool status = false; 
     bool statusChange = false; 
     while (true) 
     { 
      if (IsOnline()) 
      { 
       if (status == false && statusChange == false) 
        statusChange = status = true; 
       else if (status == false && statusChange == true) 
        status = true; 
       else if (status == true && statusChange == false) ; 
       else if (status == true && statusChange == true) 
        statusChange = false; 
      } 
      else 
      { 
       if (status == false && statusChange == false) ; 
       else if (status == false && statusChange == true) 
        status = statusChange = false; 
       else if (status == true && statusChange == false) 
       { 
        status = false; 
        statusChange = true; 
       } 
       else if (status == true && statusChange == true) 
        statusChange = false; 
      } 
      if (statusChange) 
      { 
       UpdateStaus(status); 
       statusChange= false; 
      } 
     } 
+0

'while'循環可以縮短爲'while(true){bool isOnline = IsOnline(); if(status!= isOnline){UpdateStatus(status = isOnline); }}',它稍微更具可讀性...... – Nuffin 2013-02-22 08:22:56