1

run.waitOne();で待機していないと思います。

ここでコード行を処理しているときに、一時停止ボタンをクリックしてこれらのコード行を一時停止したいとします。もう一度待つ必要があります。同じ一時停止をクリックして同じスレッドを再開しますが、まったく待機しません。これを実現するためのアイデア?

  ManualResetEvent run=new ManualResetEvent(false);
  bool flag=true;

  StartButton_Click(object sender,EventArgs e)
   {

       ThreadStart ts=new ThreadStart(startprocess);
       Thread th=new Thread(ts);
       th.Start();
   } 



  private void StartProcess()
     {
            while(true)

         {

               if (parentform != null)
              {
                  TestForm(parentform);
                  parentform = null;
               }

              else
             {
                    if (a[0] == true)
                    {
                        value[0] = method1();//method1 return a double value
                        Thread.Sleep(500);
                    }
                    if (a[1] == true)
                    {
                        value[1] =method2();
                        Thread.Sleep(500);
                    }
                    if (a[2] == true)
                    {
                        value[2] = method3();
                        Thread.Sleep(500);
                    }
                    if (a[3] == true)
                    {
                        value[3] = method4();
                        Thread.Sleep(500);
                    }
                    if (a[4] == true)
                    {
                        value[4] =method5();
                        Thread.Sleep(500);
                    }
                    if (a[5] == true)
                    {
                        value[5] = method6();
                        Thread.Sleep(500);
                    }

                    run.WaitOne();  
                    timer1.Stop();
                    DateTime now = DateTime.Now;
                    string datetime = Convert.ToString(now);
                    database.InsertTest(datetime,value[0], value[1], value[2], value[3], value[4],value[5]);           


            }     
        }

    }

     private void Pausebutton_Click(object sender, EventArgs e)
    {

            if (flag)
            {
                timer1.Enabled = true;
                run.Set();
                flag = false;                      

            }
            else
            {
                timer1.Enabled = false
                run.Reset();
                flag = true;

            }

    }
4

1 に答える 1

4

あなたは間違った方法Resetを持っSetています-あなたはそれがすでに待っているならそれを待たせようとしいます...そうでなければ、あなたは「続けてください」と言ってイベントを設定しています。

また、スレッドの状態に依存することは悪い考えです。論理的に一時停止しているかどうかを追跡し、それに応じてイベントを設定/リセットする必要があります。そうしないと、ボタンを2回続けて2回クリックすると、一時停止してから一時停止を解除したり、2回だけ一時停止したりするという厄介な状況が発生します。

于 2012-08-31T05:51:32.223 に答える