2014-10-30 5 views
0

Я отправляю образец кода, чтобы декодировать проблему с большим кодом.Windows.Forms.Timer не работает должным образом

У меня есть 2 секунды таймер - System.Windows.Forms.Timer

Каждые 2 секунды я приращение глобального ИНТ на один, и показать его значение с помощью MessageBox Если INT достигает 4, я отключить главный флаг.

Вот код

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     bool Play_On = false; 
     int i = 0; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     [STAThread] 
     static void Main() 
     { 
      Application.Run(new Form1()); 
     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      if (button1.Text == "Play") 
      { 
       button1.Text = "Puase"; 
       Play_On = true; 
      } 
      else 
      { 
       button1.Text = "Play"; 
       Play_On = false; 
      } 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Timer MinResTimer = new Timer(); 

      { 
       MinResTimer.Tick += new EventHandler(MinResTimer_Elapsed); 
       MinResTimer.Interval = 2000; 
       MinResTimer.Enabled = true; 
       MinResTimer.Start(); 
      } 
     } 
     public void MinResTimer_Elapsed(object sender, EventArgs e) 
     { 

      if (Play_On == true) 
      { 
       MessageBox.Show("timed"+ i.ToString()); 
       i++; 
      } 
      if (i == 4) 
      { 
       Play_On = false; 
       button1.Text = "Play"; 

      } 
     } 
    } 
} 

Проблема заключается в том, что флаг разве выключению на всех. Выход, который я получаю, это Timed0 - В ящике сообщений много раз. У меня возникли проблемы с сообщением - не уверен

Может кто-нибудь помочь мне узнать, что происходит здесь?

ответ

1

Перемещайте приращению я ++, чтобы перед вызовом MessageBox

Тогда вы увидите, что вы действительно хотите, чтобы защитить событие от еще стрельбы во время отображения окна сообщения.

так что ваш новый код переместит I ++ до MessageBox, а затем вы отключите и включите таймер до и после вызова окна сообщения.

+0

Я не получил то, что вы сказали. Почему в таком почтовом ящике есть такая большая проблема? Если я поставлю инкремент i ++ перед сообщением, флаг все равно не будет отключен. Если я отключу и включу таймер, я могу потерять непрерывность, которую я не хочу использовать в своем более крупном приложении. – noob

+0

@noob Я думаю, вы ожидаете, что код после 'MessageBox.Show' будет выполнен немедленно и в то же время после закрытия сообщения box ... Только один может произойти - в случае кода окна сообщения после того, как вызов будет выполнен после закрытия диалогового окна ... Вы можете создать собственное немодальное диалоговое окно, чтобы получить прежнее поведение. –

+0

Итак, пока отображается сообщение, код после этого не будет запущен? – noob

0
void MinResTimer_Elapsed(object sender, EventArgs e) 
    { 
     if (Play_On == true) 
     { 
      i++; 
      MessageBox.Show("timed" + i.ToString()); 
     } 
     if (i == 4) 
     { 
      Play_On = false; 
      MinResTimer.Enabled = false; 
      button1.Text = "Pause"; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (button1.Text == "Play") 
     { 
      button1.Text = "Puase"; 
      MinResTimer.Enabled = true; 
      i = 0; 
      Play_On = true; 
     } 
     else 
     { 
      button1.Text = "Play"; 
      MinResTimer.Enabled = false; 
      Play_On = false; 
     } 
    } 

EDIT # 1:

bool Play_On = false; 
    int i = 0; 
    Timer MinResTimer; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     MinResTimer = new Timer(); 

     { 
      MinResTimer.Tick += new EventHandler(MinResTimer_Elapsed); 
      MinResTimer.Interval = 2000; 
      MinResTimer.Enabled = true; 
      MinResTimer.Start(); 
     } 
    } 
    void MinResTimer_Elapsed(object sender, EventArgs e) 
    { 
     if (Play_On == true && i <= 4) 
     { 
      i++; 
      MessageBox.Show("timed" + i.ToString()); 
     } 
     if (i == 4) 
     { 
      Play_On = false; 
      button1.Text = "Pause"; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (button1.Text == "Play") 
     { 
      button1.Text = "Puase"; 
      Play_On = true; 
     } 
     else 
     { 
      button1.Text = "Play"; 
      Play_On = false; 
     } 
    } 
+0

Нет, я хочу, чтобы таймер работал, просто ничего не делайте, если нажата кнопка1. – noob

+0

Кроме того, ваш код дает ошибку, MinResTimer не существует в текущем контексте. – noob

+0

хорошо, если вы собираетесь использовать приведенный выше код, вам нужно сначала объявить переменную 'MinResTimer'. Затем в вашем событии Form1_Load вам нужно будет ввести этот« MinResTimer = новый таймер(); »вместо« Таймер » MinResTimer = новый таймер(); – devpro101

0

Когда MessageBox шоу, то вы не нажали кнопку 'OK', чтобы закрыть MessageBox, я не могу ++ do.So я всегда равна 0, прежде чем вы нажмете кнопку «ОК» в окне сообщений.

+0

Точно. Почему это происходит? – noob

Смежные вопросы