2017-08-25 6 views
0

できるだけ詳しく説明します。前もって感謝します。時間が切れたときに多くのタイマーを宣言してタイマーを停止するにはどうすればいいですか?

配列やその他のメソッドを使用するようなタイマーを多く宣言する方法はありますか?タイマーが切れるか時間が経過するとタイマーを停止しますか?

私はt.Stop()を試しました。と他のタイマーの方法は、私はそれを動作させることはできません。 このコードは、毎分、またはユーザーがタイマーに入力したメッセージボックスを表示します。問題は、複数のタイマーがあるときにタイマーを止めるように見えてしまうことです。

私はユーザーがタイマーを入力できるようなフォームを持っています。たとえば、1分です。このフォームは、データグリッドビューで行を選択するとポップアップし、時間または分を秒に変換して正常に動作します。ここ

after you input the timer, after 1 minute a message box will appear and stop the current timer.

private void button1_Click(object sender, EventArgs e) 
    { 
     if (textBox1.Text == "") 
     { 
      MessageBox.Show("Please Indicate How Many Minutes/Hours."); 
     } 
     else 
     { 
      string desu = textBox1.Text; 
      int temp = 0; 
      if (int.TryParse(desu, out temp)) 
      { 
       if (comboBox1.Text == "Hours") 
       { 
        //hours to seconds 
        time = temp * 3600; 
        eta = desu + "Hours"; 

        this.Close(); 
       } 
       else if (comboBox1.Text == "Minutes") 
       { 
        //minutes to seconds 
        time = temp * 60; 
        eta = desu + "Minutes"; 

        this.Close(); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Please enter a valid integer"); 
      } 
     } 
    } 
はタイマー

public void Start() 
    { 


     ETA_Input frm = new ETA_Input(this); 
     startTime = DateTime.Now; 
     t = new System.Timers.Timer(1000 * f); 
     t.Elapsed += timer_Elapsed; 
     t.Enabled = true; 

    } 

を開始するときに呼び出すメソッドで、その後、ここではフォームをトリガーどこ入力時間または数分することができ、および行を渡すところであります値をリストビューに追加し、datagridviewの値とdatabseの値のいずれかを変更します。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     ETA_Input frm = new ETA_Input(this); 
     frm.ShowDialog(); 
     if (frm.time != 0) 
     { 
      string name = dataGridView1.CurrentRow.Cells[0].Value.ToString(); 
      int deku = Int32.Parse(name); 
      string constring = "server=localhost;database=dbhorizon;uid=root;password=1234"; 
      string Query = "update tblUserIdd set User_Available = 'Ongoing' where User_ID='" + deku + "' "; 

      MySqlConnection conDatabase = new MySqlConnection(constring); 
      MySqlCommand cmdDatabase = new MySqlCommand(Query, conDatabase); 
      MySqlDataReader myReader; 

      conDatabase.Open(); 
      myReader = cmdDatabase.ExecuteReader(); 
      dgvref(); 

      string id = dataGridView1.CurrentRow.Cells[0].Value.ToString(); 
      string naem = dataGridView1.CurrentRow.Cells[1].Value.ToString(); 
      string field = dataGridView1.CurrentRow.Cells[2].Value.ToString(); 

      f = frm.time; 

      Start(); 



      seconds = string.Format("{0:HH:mm:ss tt}", DateTime.Now); 


      string[] row = { id, naem, field, seconds, frm.eta,custb }; 
      var listViewItem = new ListViewItem(row); 
      listView1.Items.Add(listViewItem); 


     } 

    } 

、ここでデータベースへのDataGridViewの値を変更しながら、私は時間が経過したタイマーを停止し、リストビュー内の項目を削除することを目的と経過時間のイベントです。私はまた、時間が経過したか経過したアイテムを取り除くように見えます。

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     TimeSpan timeSinceStart = DateTime.Now - startTime; 
     MessageBox.Show("A Service is finished"); 

     string name = dataGridView1.CurrentRow.Cells[0].Value.ToString(); 
     int deku = Int32.Parse(name); 
     string constring = "server=localhost;database=dbhorizon;uid=root;password=1234"; 
     string Query = "update tblUserIdd set User_Available = 'Available' where User_ID='" + deku + "' "; 

     MySqlConnection conDatabase = new MySqlConnection(constring); 
     MySqlCommand cmdDatabase = new MySqlCommand(Query, conDatabase); 
     MySqlDataReader myReader; 

     conDatabase.Open(); 
     myReader = cmdDatabase.ExecuteReader(); 
     dgvref(); 
    } 
+0

チェックこのhttps://stackoverflow.com/questions/1435876/do-c-sharp-timersにtheresのリセット-elapse-on-a-separate-thread –

答えて

0
 int numberOfThreads = 0; 
     int seconds = 0; 
     List<System.Threading.Thread> timer = new List<System.Threading.Thread>();//(timex(6))>(); 

     //create many threads together 
     for (int i = 0; i < numberOfThreads; i++) 
     { 
      System.Threading.Thread tempx = new System.Threading.Thread(timex(seconds)); 
      timer.Add(tempx); 
      tempex = null; 
      timer[i].Start(); 
     } 

     //each time a timer is needed 
     System.Threading.Thread temp = new System.Threading.Thread(timex(seconds)); 
     temp.Start(); 


     private System.Threading.ThreadStart timex(int seconds) 
     { 
      for (int i = 0; i < seconds; i++) 
       { 
        //your code here 
        System.Threading.Thread.Sleep(1000); 
       } 
      MessageBox.Show("A service has finished"); 
      return null; 
     } 
+0

私はこの作業を私が望むようにすることはできません。はい、1秒ごとにメッセージボックスを起動します。何をしようとしているのは、経過したタイマーを使用してタイマーを終了させることですが、もう一方のタイマーで他のタイマーを停止することなく再開します。 – yuzirui

+0

あなたは複数のスレッドを持っていて、それぞれのスレッドに必要な値を与えます。希望する期間を入力して、それらを自発的に実行させます。しかし、 –

+0

が私の答えを投稿しました。他の問題が出現している。 – yuzirui

0

私は私が望むものに十分イムに近いと思います。私が望むものに似ています

timer2.Start(); 

私は上記のコードをInitializeComponent()の下に置きます。

その後、

private DateTime startTime; 

私は申し訳ありません私のコードが乱雑で、どこかに日付時刻を宣言しました。

ここで、Start()で代わりにdatetimeを取得します。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     ETA_Input frm = new ETA_Input(this); 
     frm.ShowDialog(); 
     if (frm.time != 0) 
     { 
      string name = dataGridView1.CurrentRow.Cells[0].Value.ToString(); 
      int deku = Int32.Parse(name); 
      string constring = "server=localhost;database=dbhorizon;uid=root;password=1234"; 
      string Query = "update tblUserIdd set User_Available = 'Ongoing' where User_ID='" + deku + "' "; 

      MySqlConnection conDatabase = new MySqlConnection(constring); 
      MySqlCommand cmdDatabase = new MySqlCommand(Query, conDatabase); 
      MySqlDataReader myReader; 

      conDatabase.Open(); 
      myReader = cmdDatabase.ExecuteReader(); 
      dgvref(); 

      string id = dataGridView1.CurrentRow.Cells[0].Value.ToString(); 
      string naem = dataGridView1.CurrentRow.Cells[1].Value.ToString(); 
      string field = dataGridView1.CurrentRow.Cells[2].Value.ToString(); 

      f = frm.time; 




      startTime = DateTime.Now; 

      secondss = string.Format("{0:HH:mm:ss tt}", DateTime.Now); 


      string[] row = { id, naem, field, secondss, frm.eta,custb, f.ToString() }; 
      var listViewItem = new ListViewItem(row); 
      listView1.Items.Add(listViewItem); 


     } 

    } 

、その後、私はメッセージボックスがまだ表示されませんが、タイマーが作動しているここで

private void timer2_Tick(object sender, EventArgs e) 
    { 

     foreach (ListViewItem items in listView1.Items) 
     { 
      TimeSpan timeSinceStart = DateTime.Now - startTime; 
      items.SubItems[6].Text = string.Format("{0}h {1}m {2}s", timeSinceStart.Hours, timeSinceStart.Minutes, timeSinceStart.Seconds); 

     } 

Tickイベントに私の経過イベントを変更します。また、タイマはカウントダウンしますが、いずれにしても動作している限り問題はありません。

が、別の問題が、毎回私は入力時に、以前のカウンタ/カウントダウンが0 here is the image where it resets to 0

関連する問題