2013-12-07 3 views
2

Это Form1C# таймер не работает?

Я пытаюсь использовать переменный уровень от form2 установить интервал таймера в form1

int time = 0; 


    public Form1() 
    { 

     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     timer1.Start(); 

    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     time++; 

Интервал таймера: устанавливаются в зависимости от значения переменного «уровня», который расположенный в form2

 if (Form8.level.Equals("expert")) 
     { 

      timer1.Interval = 10000; 


      if (time == 10000) 
      { 

       timer1.Stop(); 
       MessageBox.Show("time ended"); 
      } 
     } 
     else 
     { 

      timer1.Equals(60000); 


      if (time==60000) 
      { 
       timer1.Stop(); 
       MessageBox.Show("time ended"); 
      } 
     } 
    } 

Это Form2

Это переменная, которую я хочу использовать в form1

 public Static String level = ""; 


    private void button1_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 


     Form1 f1 = new Form1(); 
     f1.Show(); 
    } 
+0

Является ли мероприятие загрузки надлежащим образом прикрепленным? Где вы создаете экземпляр таймера? – ChrisK

+0

Используйте отладчик. Каков интервал при первом запуске таймера? Вы можете получить доступ только к другой форме после ее отметки. – nvoigt

+0

@ChrisK Мне не нужно создавать экземпляр, я просто перетаскиваю таймер из панели инструментов и начинаю кодирование, вот чему меня научили. – Sarah

ответ

3

Общие рекомендации

Хорошо, я не думаю, что ваш код действительно не так, есть только некоторые проблемы, которые могут создать впечатление, что ваш код не работает.

Прежде всего, я предлагаю вам более правильно называть ваши классы. Я лично, как правило, называю свои формы после их функциональности. Поэтому вы можете подумать о переименовании Form8 в DifficultyForm. Таким образом, намного легче понять ваш код. Кроме того, имя типа elapsedLevelTime дает представление о цели таймера. Если кто-то еще смотрит на ваш код, человек не будет знать timer1.

Recap проблемы

Теперь давайте быстро резюмировать то, что код должен делать: пользователь, кажется, выбрать трудность какой-то. Затем отображается другое окно. В показанном окне таймер должен увеличиваться, пока не будет достигнуто определенное время. Затем отобразится текст «время, закончившееся».

Как вы описали, вы создали много вещей в Дизайнере. Поэтому я предполагаю, что все события подключены должным образом. Это приводит к выводу, что преступник находится в вашем timer1_elapsed, код, который на самом деле рассчитывает истекшее время:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    time++; 
    if (Form8.level.Equals("expert")) 
    { 

     timer1.Interval = 10000; 


     if (time == 10000) 
     { 

      timer1.Stop(); 
      MessageBox.Show("time ended"); 
     } 
    } 
    else 
    { 

     timer1.Equals(60000); 


     if (time==60000) 
     { 
      timer1.Stop(); 
      MessageBox.Show("time ended"); 
     } 
    } 
} 

Что алгоритм делает и возможные подводные камни

При отладке алгоритмов, Rubber duck debugging является - несмотря на смешное имя - ценный подход. Итак, давайте проверим ваш код.

  • Таймер запускается при загрузке формы.Вы не указали настройки таймера, но по умолчанию таймер имеет интервал 100 мс. Таким образом, метод tick поднимается примерно 10 раз в секунду.

  • Когда таймер гаснет, time будет увеличен на единицу. Таким образом, после 1 секунды time будет 10.

  • Теперь вы проверяете, выбран ли выбранный уровень экспертом. Таким образом, у нас есть варианты здесь:

    a. Уровень эксперт. В этом случае вы установите интервал 10000. Это приведет к тому, что событие tick будет поднято каждые 10 секунд. Затем вы проверяете, является ли time -переменная 10000. Если это так, вы завершаете таймер и показываете «время закончилось». Вот два вопроса:

    1. Вы используете if (time == 10000) вместо if (time >= 10000). Таким образом, если переменная time обновляется без проверки, таймер никогда не закончить
    2. Благодаря установке интервала 10000 состояние достигается после 10000 * 10s секунд, что составляет около 27 часов.

    b. Уровень не эксперт. Здесь также есть некоторые проблемы с вашим кодом:

    1. timer1.Equals(60000); здесь бесполезно. Метод Equals будет в основном проверять, timer1 == 60000;.
    2. Такая же проблема с if -condition. См. Выше: a1
    3. Из-за интервала по умолчанию 100 мс, состояние будет достигнуто после 60000 * 0.1s, около 100 минут.

Возможное решение

Вот несколько советов, чтобы улучшить код:

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

  • Проверьте использование timer1.Equals(60000)

  • Проверьте, если вы действительно хотите эти длинные интервалы

  • Убедитесь, что вы понимаете, какое значение time содержит, и как часто она увеличивается

Я попытался воссоздать вашу проблему в небольшом проекте WindowsForm с возможным решением:

public partial class Form1 : Form 
{ 
    private Timer secondMeasureTimer; 
    private int elapsedTime; //in seconds 

    private string level = "expert"; 

    public Form1() 
    { 
     InitializeComponent(); 

     secondMeasureTimer = new Timer(); 
     secondMeasureTimer.Tick += secondMeasureTimer_Tick; 
     secondMeasureTimer.Interval = 1000; // 1 second resolution 
    } 

    void secondMeasureTimer_Tick(object sender, EventArgs e) 
    { 
#if DEBUG 
     System.Diagnostics.Debugger.Log(0, "secondMeasure", "secondMeaserTimer ticked at " + DateTime.Now + Environment.NewLine); // Output every time the event is raised for debugging purposes 
#endif 

     elapsedTime++; // increas time every second 

     if (level == "expert" && elapsedTime >= 10) 
     { 
      textBox1.Text = "10 seconds elapsed"; 
      secondMeasureTimer.Stop(); 
     } 
     else if (elapsedTime >= 60) 
     { 
      textBox1.Text = "60 seconds elapse"; 
      secondMeasureTimer.Stop(); 
     } 
    } 

    private void timerButton_Click(object sender, EventArgs e) 
    { 
     if (secondMeasureTimer.Enabled) 
     { 
      secondMeasureTimer.Stop(); 
     } 
     else 
     { 
      elapsedTime = 0; 
      secondMeasureTimer.Start(); 
     } 
    } 
} 
+0

большое спасибо за вашу помощь, я получил его сейчас. – Sarah

0

Вместо закрытия попробуйте следующий метод

private void button1_Click(object sender, EventArgs e) 
{ 
    this.Hide(); 

    Form1 f1 = new Form1(this); 
    f1.Show(); 
} 
+0

Вызов 'close()' в форме содержит все элементы управления, поэтому он также будет располагать таймер. Вызов 'Скрыть()' удалит форму из представления, но она останется «загруженной». Лучшим решением было бы поставить таймер в его собственный контекст, а не на форму. – jessehouwing

+0

@jesse: он не будет видимым для пользователя, и он будет закрыт, когда приложение будет закрыто. – ShaQue

+0

Да, это то, что я сказал. – jessehouwing

1

если это не веб-приложение, которое вы можете использовать статические переменные

т.е., общественного staic уровня String = "";

Тогда доступ к formname.level даст вам значение этого.

Просто попробуйте, это может вам помочь.

+0

Да, это не веб-приложение, это помогло. Но таймер не работал. – Sarah

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