C # Timer - запуск кода во время работы таймера - PullRequest
0 голосов
/ 02 мая 2018

Я новичок в C # и пытаюсь создать простую программу тренировки мозга с использованием Windows Forms, которую я изучил, изучая разработку приложений для Android. Я застрял на таймере. У меня это работает, и это срабатывает каждую секунду и обновляет метку в моей форме. Когда я добавляю код после запуска таймера, таймер останавливается. Как будто я не бегаю на заднем плане. Я много читал о таймерах потоков, таймерах и т. Д., Но мне не удалось заставить что-либо работать. Как я уже сказал, я новичок в C #, поэтому, пожалуйста, будьте осторожны ... Он мой код ....

public partial class BrainTrainer : Form
{
    // Set global timer variables & Create Timer
    static int secondCounter = 10;
    static bool play = false;
    static Timer myTimer = new Timer();


    public BrainTrainer()
    {
        // Set up form
        InitializeComponent();
        toggleLabels(false);
        timerLbl.Text = secondCounter.ToString() + "s";


    }

    // Function to loop through labels and disabled them
    private void toggleLabels(bool state)
    {
        var ansLabels = this.Controls.OfType<Label>()
            .Where(c => c.Name.StartsWith("ans"))
            .ToList();

        foreach (var label in ansLabels)
        {

            label.Enabled = state;
        }
    }

    // Event to run every second
    private void TimerEventProcessor(Object myObject, EventArgs e)
    {
        if (secondCounter == 0)
        {
            //Stop Game
            myTimer.Stop();
            play = false;

        }
        else
        {
            // Countdown 1 and update label
            secondCounter--;
            timerLbl.Text = secondCounter.ToString()+"s";
        }
    }

    private void startBtn_Click(object sender, EventArgs e)
    {
        // Hide button, set play to true and enable labels
        startBtn.Hide();
        play = true;
        toggleLabels(true);

        // Set up timer event, interval and start
        myTimer.Tick += new EventHandler(TimerEventProcessor);
        myTimer.Interval = 1000;
        myTimer.Start();
        // Run function to play
        genEquation();    

    }

    private void genEquation()
    {
        while (play)
        {
            Console.WriteLine(secondCounter);   
        }

    }

}

Любая помощь очень важна, или ссылка на полезный учебник была бы полезна!

1 Ответ

0 голосов
/ 02 мая 2018

Проблема была решена в комментариях

Вы блокируете текущий поток и не даете ему времени обработать .Tick-событие. Таймер Winforms не запускает поток для него. Попробуйте вызвать Application.DoEvents () в цикле genEquation (), чтобы обработать событие.

private void genEquation()
{
    while (play)
    {
        Application.DoEvents();   
        Console.WriteLine(secondCounter);
    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...