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の場合は、コードを実行しないでください。

誰かが私の問題の解決策を知っていますか?

4

3 に答える 3

2

このコードの全体的な構造に関する明らかな問題は別として(while(true)を終了する予定がある場合は教えていただけますか?)、質問のみに焦点を当てるこの方法で内部ループを変更する必要があると思います

    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);
    }

lastCountUSBポート検出コードを介した前のループの結果を追跡する変数を追加し、foreachループの最後でのみリストボックスの更新を呼び出すように内部ループを変更しました。xxxClock変数がまだ使用されているかどうかわからない。

于 2013-02-08T08:11:22.577 に答える
1

前のチェックの値を保持する別の変数を追加する必要があります。次に、現在の金額を前の金額と比較し、それに応じてロジックを実行できます。

その値をtry-blockの最後のステップとして保存します。ただし、whileブロックの先頭にint newVar = 0を配置しないでください。配置すると、必要な結果が得られません。

また、コードを少しクリーンアップする必要があります。

編集:スティーブがやったようです。(余分なvar +クリーンアップ)

于 2013-02-08T08:11:37.630 に答える
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);
    }
}
于 2013-02-08T08:16:39.983 に答える