Таймер Winforms для макетов

Любой Bash запускает файлы - ~/.bashrc, ~/.bash_profile, ~/.profile. Существует также своего рода странный файл, названный ~/.MacOSX/environment.plist для переменных среды в приложениях GUI.

16
задан ChrisF 24 July 2009 в 17:30
поделиться

4 ответа

Дело в том, что вы уменьшаете timeLeft до тех пор, пока не достигнет нуля на самом первом тике таймера. Уберите цикл do ... while , и вы получите в основном рабочий пример.

Однако, если вы собираетесь выполнять какой-либо объем работы с Windows Forms, вам нужно узнать о потоках и как это влияет на пользовательский интерфейс. Вы очень быстро окажетесь здесь, если не будете рассказывать о бесполезных исключениях и некорректных компонентах пользовательского интерфейса. У Джона Скита есть отличная серия потоков . Я очень рекомендую это. В нем есть раздел, посвященный таймерам, что может дать вам дополнительную информацию.

8
ответ дан 30 November 2019 в 22:02
поделиться

Вам не потоки, если вы используете таймер 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();
    }
}

Я полагаю, что если вы пришли из Интернета, программирование, управляемое событиями, вероятно, то, о чем вам нужно начать читать, если вы хотите понять, как программируются вещи на рабочих столах.

9
ответ дан 30 November 2019 в 22:02
поделиться

Помимо удаления цикла (согласно ответу Джейсона), ваш подход может стать немного неточно, если приложение занято. Хотя вы указываете их интервал в миллисекундах, таймеры WinForms имеют разрешение 18 мс и очень низкий приоритет, цикл сообщений проверяет таймеры только в том случае, если ему нечего делать.

Итак, сохраните значение StartTime (DateTime) и используйте его для расчета оставшегося времени в каждом событии таймера. Для достижения минуты вам может понадобиться 61 тик.

3
ответ дан 30 November 2019 в 22:02
поделиться

Вы не хотите делать какие-либо циклы в обработчике событий. Обработчик вызывается один раз за «тик» таймера - каждые 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;
    }
}
2
ответ дан 30 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: