1

タイマーを使用して、2秒ごとにテキストボックスにテキストを出力しています。しかし、うまくいかないようです。何が間違っているのか。ここに私のコードがあります:

public partial class Form1 : Form
{
    public Form1()
    {
      InitializeComponent();
    }

    public static System.Timers.Timer aTimer;

    public void BtnGenData_Click(object sender, EventArgs e)
    {
      aTimer = new System.Timers.Timer(10000);

      // Hook up the Elapsed event for the timer.
      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

      // Set the Interval to 2 seconds (2000 milliseconds).
      aTimer.Interval = 2000;
      aTimer.Enabled = true;
    }

    public static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
      string GenData = "Welcome";
      Form1 frm1 = new Form1();
      frm1.TboxData.AppendText(GenData.ToString());
    }
}

実際には、出力が表示されません。

4

2 に答える 2

1

これはコードにある問題とは直接関係ありませんが...

MSDN System.Timers.Timerから:

サーバーベースのタイマーは、マルチスレッド環境でワーカー スレッドを使用するように設計されています。

Windows フォームでは、 System.WindowsForms.Timerを使用できます。

    System.Windows.Forms.Timer timer;

    public Form1()
    {
        InitializeComponent();

        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += new EventHandler(timer_Tick);
    }

    public void BtnGenData_Click(object sender, EventArgs e)
    {
        BtnGenData.Enabled = false;
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        timer.Stop();
        BtnGenData.Enabled = true;

        //do what you need
    }

コードに関しては、なぜタイマーを静的にするのですか? これを使用してみてください:

 public partial class Form1 : Form
 {
    public Form1()
    {
        InitializeComponent();
    }

    public System.Timers.Timer aTimer;

    public void BtnGenData_Click(object sender, EventArgs e)
    {
        aTimer = new System.Timers.Timer(10000);
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Interval = 2000;
        aTimer.Enabled = true;
    }

     public void OnTimedEvent(object source, ElapsedEventArgs e)
     {
        this.TboxData.AppendText("Welcome");
     } 
 }

また、ボタンを 2 回押した場合に何が起こるかを考慮する必要があります...

于 2012-12-03T08:04:32.387 に答える
1

問題はこの方法にあります:

public static void OnTimedEvent(object source, ElapsedEventArgs e)
{


    string GenData = "Welcome";
    Form1 frm1 = new Form1();
    frm1.TboxData.AppendText(GenData.ToString());

}

を呼び出すnew Form1();と、新しいフォームが作成されます。このフォームは非表示として作成され、テキストを変更しますが、表示されず、このメソッドの最後でガベージ コレクションされます。あなたが望むのは、既存のものを再利用することです。この行を完全に削除して、既存のフォームを使用してください。デフォルトでは、名前はform1

public static void OnTimedEvent(object source, ElapsedEventArgs e)
{


    string GenData = "Welcome";
    form1.TboxData.AppendText(GenData.ToString());

}
于 2012-12-03T08:02:15.910 に答える