Любой Bash запускает файлы - ~/.bashrc
, ~/.bash_profile
, ~/.profile
. Существует также своего рода странный файл, названный ~/.MacOSX/environment.plist
для переменных среды в приложениях GUI.
Дело в том, что вы уменьшаете timeLeft
до тех пор, пока не достигнет нуля на самом первом тике таймера. Уберите цикл do ... while
, и вы получите в основном рабочий пример.
Однако, если вы собираетесь выполнять какой-либо объем работы с Windows Forms, вам нужно узнать о потоках и как это влияет на пользовательский интерфейс. Вы очень быстро окажетесь здесь, если не будете рассказывать о бесполезных исключениях и некорректных компонентах пользовательского интерфейса. У Джона Скита есть отличная серия потоков . Я очень рекомендую это. В нем есть раздел, посвященный таймерам, что может дать вам дополнительную информацию.
Вам не потоки, если вы используете таймер winforms.
Перетащите элемент управления Timer на свою страницу, назовите его «таймер» и вставьте следующее код:
public MainForm()
{
InitializeComponent();
timer.Interval = 1000;
timer.Start();
timeLeft = 60;
timer.Tick += Timer_Tick;
// start things
label1.Hide();
button1.Hide();
timer.Start();
}
public void Timer_Tick(object sender, EventArgs e)
{
timeLeft--;
if (timeLeft <= 0) {
timer.Stop();
label1.Show();
button1.Show();
}
}
Я полагаю, что если вы пришли из Интернета, программирование, управляемое событиями, вероятно, то, о чем вам нужно начать читать, если вы хотите понять, как программируются вещи на рабочих столах.
Помимо удаления цикла (согласно ответу Джейсона), ваш подход может стать немного неточно, если приложение занято. Хотя вы указываете их интервал в миллисекундах, таймеры WinForms имеют разрешение 18 мс и очень низкий приоритет, цикл сообщений проверяет таймеры только в том случае, если ему нечего делать.
Итак, сохраните значение StartTime (DateTime) и используйте его для расчета оставшегося времени в каждом событии таймера. Для достижения минуты вам может понадобиться 61 тик.
Вы не хотите делать какие-либо циклы в обработчике событий. Обработчик вызывается один раз за «тик» таймера - каждые 1000 миллисекунд, как вы его настроили. Итак, вы хотите уменьшить значение переменной timeLeft
один раз за вызов, а затем выключить все это, когда timeLeft
достигнет нуля.
// untested
private void CountDown(object sender, EventArgs e)
{
this.TimeBar.Value = timeLeft;
this.timeLeft--;
if (this.TimeBar.Value == 0)
{
gt.Stop();
this.label1.Visible = true;
this.button1.Visible = true;
}
}