0
private void timer1_Tick(object sender, EventArgs e)
{        
   string[] DF_Engines = { Form2.Engine1, Form2.Engine2, Form2.Engine3, Form2.Engine4, Form2.Engine5, Form2.Engine6 };
   foreach (string DF_Engine in DF_Engines)
   {
       if (Convert.ToDouble(DF_Engine) != 99)
       {
           string Hex_ADD1 = "{" + DF_Engine + "|";
           Console.WriteLine(Hex_ADD1);
           serialPort1.Write(Hex_ADD1);
           n = Convert.ToInt16(DF_Engine);               
        }
    }
}

Form2.Engine1, Form2.Engine2....... はForm2、対応するチェックボックスが選択されたときの値です。これらは 1, 2 , 3 などになります....私のコードは、チェックボックス1が選択されたときに01を送信しますが、フォーム2でチェックボックス1とチェックボックス2が選択されたときに遅延なく01,02を送信します。興味があるので、01 と 02 などを尋ねるときに遅延が必要です。どうすれば納得できますか? を使用するThread.Sleep(500)と、アプリケーションが遅くなります。指導が必要です。

4

2 に答える 2

0

BackgroundWorkerコントロールだけの別のスレッドを使用することを検討できます。このように、Thread.Sleep()メソッドを使用でき、アプリケーションの GUI が応答しなくなることはありません。詳細については、msdn: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspxを参照してください。

BackgroundWorkerコントロールをフォームに追加し、次のコードを使用して適切なイベントを処理します。

private void timer1_Tick(object sender, EventArgs e)
{
    string[] DF_Engines = { Form2.Engine1, Form2.Engine2, Form2.Engine3, Form2.Engine4, Form2.Engine5, Form2.Engine6 };

    //disable timer1, so it wont tick again until the current work is finished
    timer1.Stop();

    //start processing asynchronously, so GUI is still responsive
    sampleBackgroundWorker.RunWorkerAsync(DF_Engines);
}

//this method should be attached to DoWork event of the BackgroundWorker
private void sampleBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string[] DF_Engines = (e.Argument as string[]);

    foreach (string DF_Engine in DF_Engines)
    {
        if (Convert.ToDouble(DF_Engine) != 99)
        {
            string Hex_ADD1 = "{" + DF_Engine + "|";
            Console.WriteLine(Hex_ADD1);
            serialPort1.Write(Hex_ADD1);
            //n gets overwritten in each iteration, is this line required?
            n = Convert.ToInt16(DF_Engine);

            Thread.Sleep(500);
        }
    }

    //you can also pass a result from this method back to the GUI thread like this
    //e.Result = "job done";
    //this can be read later in RunWorkerCompleted method of the BackgroundWorker
}

//this method should be attached to RunWorkerCompleted event of the BackgroundWorker
private void sampleBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //start timer1, so it can invoke the worker again
    timer1.Start();
}

これについてさらにサポートが必要な場合は、お知らせください。

于 2012-08-04T07:02:53.060 に答える
0

UI スレッドで Thread.Sleep を使用しないでください。それは間違いなくあなたのアプリケーションを遅くします。代わりに、新しいスレッドを開始し、そのスレッドにデータを渡し、そのスレッドがアプリケーションに入力を遅らせて送信できるようにします。

System.Threading.Thread thread = new System.Threading.Thread((inputList) =>
    {
       foreach (var input in inputList as IEnumerable<int>)
       {
          //Send input
          System.Threading.Thread.Sleep(500);
        }
      });
  thread.Start();

inputList はデータの配列です(選択したチェックボックスに応じて1、2など)。

于 2012-08-04T07:03:42.490 に答える