Общие рекомендации
Хорошо, я не думаю, что ваш код действительно не так, есть только некоторые проблемы, которые могут создать впечатление, что ваш код не работает.
Прежде всего, я предлагаю вам более правильно называть ваши классы. Я лично, как правило, называю свои формы после их функциональности. Поэтому вы можете подумать о переименовании 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
. Если это так, вы завершаете таймер и показываете «время закончилось». Вот два вопроса:
- Вы используете
if (time == 10000)
вместо if (time >= 10000)
. Таким образом, если переменная time
обновляется без проверки, таймер никогда не закончить
- Благодаря установке интервала
10000
состояние достигается после 10000 * 10s
секунд, что составляет около 27 часов.
b. Уровень не эксперт. Здесь также есть некоторые проблемы с вашим кодом:
timer1.Equals(60000);
здесь бесполезно. Метод Equals
будет в основном проверять, timer1 == 60000;
.
- Такая же проблема с
if
-condition. См. Выше: a1
- Из-за интервала по умолчанию 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();
}
}
}
Является ли мероприятие загрузки надлежащим образом прикрепленным? Где вы создаете экземпляр таймера? – ChrisK
Используйте отладчик. Каков интервал при первом запуске таймера? Вы можете получить доступ только к другой форме после ее отметки. – nvoigt
@ChrisK Мне не нужно создавать экземпляр, я просто перетаскиваю таймер из панели инструментов и начинаю кодирование, вот чему меня научили. – Sarah