2013-02-08 59 views
0
我While循环有问题

我',这个while循环,只要需要的东西我虽然循环的最后一次改变为更新。While循环,检查上次运行

这是我的代码,它是在一个线程中运行:

private void CheckAllPorts() 
{ 
    while (true) 
    { 
      MultipleClock = false; 
      OneClock = false; 
      NoClock = false; 

      portCount = 0; 

      //clear the string list. 
      MultiplePortNames.Clear(); 

      //create an object searcher and fill it with the path and the query provided above. 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 

      try 
      { 
       foreach (ManagementObject queryObj in searcher.Get()) 
       { 
        if (queryObj["InstanceName"].ToString().Contains("USB") || queryObj["InstanceName"].ToString().Contains("FTDIBUS")) 
        { 
         portCount = searcher.Get().Count; 

         if (portCount > 1) 
         { 
          MultiplePortNames.Add(queryObj["PortName"].ToString()); 
          form1.UpdateListBox(MultiplePortNames); 
          MultipleClock = true; 
         } 
         else if (portCount == 1) 
         { 
          MultiplePortNames.Add(queryObj["PortName"].ToString()); 
          form1.UpdateListBox(MultiplePortNames); 
          OneClock = true; 
         } 
        } 
        else 
        { 
         NoClock = true; 
         form1.UpdateListBox(MultiplePortNames); 
        } 
       } 
      } 
      catch 
      { 
       NoClock = true; 
       form1.UpdateListBox(MultiplePortNames); 
      } 

     Debug.WriteLine("NoClock = " + NoClock); 
     Debug.WriteLine("OneClock = " + OneClock); 
     Debug.WriteLine("MultipleClock = " + MultipleClock); 

     Thread.Sleep(500); 
    } 
} 

因此,如果portCount为1最后一次,它是这个时候别的东西,如:0或4,然后 它需要执行此代码:

form1.UpdateListBox(MultiplePortNames); 

当portCount类似于上次的2时,它也是2次,这段代码不应执行。

有没有人知道我的问题的解决方案?

+0

为什么你也很难在你的while语句编码“真”? – Ruben

+0

仅用于调试信息。 – Max

回答

2

除了与该代码的整体结构(你能告诉我,当你打算从,虽然(退出真)?),只专注于你的问题,我认为你应该改变内部循环在这个明显的问题方式

int lastCount = 0; 
    while (true) 
    { 
      portCount = 0; 
      MultipleClock = false; 
      OneClock = false; 
      NoClock = false; 

      //clear the string list. 
      MultiplePortNames.Clear(); 

      //create an object searcher and fill it with the path and the query provided above. 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 

      try 
      { 
       portCount = searcher.Get().Count; 

       foreach (ManagementObject queryObj in searcher.Get()) 
       { 
        if (queryObj["InstanceName"].ToString().Contains("USB") || queryObj["InstanceName"].ToString().Contains("FTDIBUS")) 
        { 

         if (portCount >= 1) 
          MultiplePortNames.Add(queryObj["PortName"].ToString()); 
        } 
       } 
      } 
      catch 
      { 
       // Don't like an empty catch, but perhaps in this case it could be justified 
      } 
      if(portCount == 1) 
       OneClock = true; 
      else if(portCount > 1) 
       MultipleClock = true; 
      else 
       NoClock = true; 

      if(lastCount != portCount) 
      { 
       lastCount = portCount; 
       form1.UpdateListBox(MultiplePortNames); 
      } 
      Debug.WriteLine("NoClock = " + NoClock); 
      Debug.WriteLine("OneClock = " + OneClock); 
      Debug.WriteLine("MultipleClock = " + MultipleClock); 

      Thread.Sleep(500); 
    } 

我添加了一个lastCount变量来跟踪先前循环通过USB端口发现代码的结果,改变了内循环调用列表框更新只在foreach循环的结束。不知道xxxClock变量是否仍然有用。

+0

它是在一个线程中运行,并且此线程将永远不会停止,这个线程会显示在列表框中的所有连接的USB设备,因此,当一个被拔出,这将是可见立刻, – Max

+0

非常糟糕的主意叫'计数() '方法agains'在'foreach'正文中可枚举 –

+0

您应该推荐哪种方式来计算searcher.Get()的查询结果数量? – Max

1

您需要添加另一个变量,并保留前一个检查的值。 然后你可以比较当前的金额和以前,并相应地做你的逻辑。

存储该值作为在试块中的最后一步。 不要把int newVar = 0放在你的while-block的开始处,或者它不会有所需的结果。

您还需要清理你的代码位。

编辑:看起来像史蒂夫刚刚做到了。 (额外的VAR +清理)

1

尝试重新安排这样的代码:

private void CheckAllPorts() 
{ 
    while (true) 
    { 
     MultipleClock = false; 
     OneClock = false; 
     NoClock = false; 

     portCount = 0; 

     //clear the string list. 
     MultiplePortNames.Clear(); 

     //create an object searcher and fill it with the path and the query provided above. 
     ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 

     try 
     { 
      var results = searcher.Get().Where(queryObj=> 
        queryObj["InstanceName"].ToString().Contains("USB") || 
        queryObj["InstanceName"].ToString().Contains("FTDIBUS")); 

      if (portCount != results.Count()) 
      { 
       portCount = results.Count(); 

       if (portCount > 1) 
       { 
        MultipleClock = true; 
       } 
       else if (portCount == 1) 
       { 
        OneClock = true; 
       } 
       else if (portCount == 0) 
       { 
        NoClock = true; 
       } 

       foreach (ManagementObject queryObj in results) 
       { 
         MultiplePortNames.Add(queryObj["PortName"].ToString()); 
       } 

       form1.UpdateListBox(MultiplePortNames); 
      } 
     } 
     catch 
     { 
      NoClock = true; 
      form1.UpdateListBox(MultiplePortNames); 
     } 

     Debug.WriteLine("NoClock = " + NoClock); 
     Debug.WriteLine("OneClock = " + OneClock); 
     Debug.WriteLine("MultipleClock = " + MultipleClock); 

     Thread.Sleep(500); 
    } 
}