2013-02-21 182 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