-3

いくつかのスレッドを実行していますが、エラーが検出されたら、メッセージボックスなどの対話を使用して実行を継続または停止します。また、画面に複数のメッセージボックスを表示したくないので、セマフォを追加して、1 つのスレッドだけで処理できるようにしました。しかし、うまくいきません。だから私は次のような状況にあります:

    private void DO_WORK()
    {
    //some code missing
            lock (_threadLock)
            {
                ++activeWorkers;
            }

            ThreadPool.QueueUserWorkItem(o =>
                {
                    WorkRequests(result);
                    lock (_threadLock)
                    {
                        --activeWorkers;
                        Monitor.Pulse(_threadLock);
                    }
                });

            lock (_threadLock)
            {
                if (STOP)
                    break;
                while (activeWorkers > THREADS)
                    Monitor.Wait(_threadLock);
            }
     }


    private void WorkRequests(string mystr)
    {
        string source = null;
        string result = null;
        bool processed = false;
        bool messageBoxShown = false;
   ///////////////////////////////////
      while(true)//this is for rechecking the bad ones
      {
            source = GetSource(mystr);
            if (source == "ERROR_LIMITED")
            {

              lock (_threadLock)
              {

                if (!messageBoxShown)//<--- check messageBoxShown
                {
                    if (MessageBox.Show("Blocked IP detected!\nPlease change it!", "test program", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK)
                    {
                        messageBoxShown = true; //<--- set to true
                    }
                    else
                        DoStop();
                }
              }
            }
          else
              break;
       }
            result = mystr + " - " + source;
  ////////////////////////////////////////
    }

メッセージボックスを表示し、ダイアログボックスに基づいて実行を継続または停止するスレッドを除くすべてのスレッドを一時停止するにはどうすればよいですか?

4

2 に答える 2

1

実際には、コードの問題は、他のスレッドを停止したり、表示をスキップしたりしないことです。実際には、コードはMessageBoxMessageBox ブロックを実行できるスレッドの数を1に制限しているため、1 つずつ表示を開始します。

代わりに、このようなことを試してください

private volatile bool messageBoxShown = false;//Declare a Instance variable

var source = validate(mystr);   
if (source == "ERROR")
{
    lock (_threadLock)
    {
        semaf.WaitOne();
    }
    if(messageBoxShown)<--- check messageBoxShown
    {
        return;// or skip showing messagebox do whatever you want
    }
    if (MessageBox.Show("Blocked IP detected!\nPlease change it!", "test program", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK) 
    {  
        lock (_threadLock)
        {
            messageBoxShown = true; <--- set to true
            semaf.Release();
        }
    }
    else
        DoStop();
}

これで問題が解決することを願っています。

于 2013-08-03T10:21:17.003 に答える