Как я могу заставить свой Пока-l oop выйти / прерваться, когда я отпущу кнопку? - PullRequest
0 голосов
/ 17 января 2020

в чем здесь проблема? почему в то время как l oop требуется finni sh, чтобы получить событие keyup, даже если я его уже выпустил ..

Я знаю, что это только время, потому что, если я использую только текстовые поля, keyIsDown не меняется значение, пока я не отпущу кнопку.

void KeyDown(object sender, KeyEventArgs e)
{
    keyIsDown = true;
    if (e.KeyCode.ToString() == "F6")
    {
        while(keyIsDown)
        {
            //do something
            Thread.Sleep(100);
            if (!keyIsDown)
                break;
            //do something
            Thread.Sleep(100);
            if (!keyIsDown)
                break;
            //do something
            Thread.Sleep(100);
            if (!keyIsDown)
                break;
            //do something
            Thread.Sleep(100);
            if (!keyIsDown)
                break;
            break;
        }           
    }
    e.Handled = false;
}

void KeyUp(object sender, KeyEventArgs e)
{
    keyIsDown = false;
    e.Handled = true;
}

1 Ответ

0 голосов
/ 17 января 2020

Потому что, пока ваш KeyDown метод выполняется в al oop, другие методы не могут быть запущены. То есть KeyUp никогда не запустится, и вы застрянете.

В приложении Windows Forms (winforms) событие никогда не будет прервано для другого события. Хандер второго события (KeyUp) должен ждать до завершения первого.

Не ясно, чего вы пытаетесь достичь, поскольку ваш код ничего не делает, кроме ожидания.

Если вы хотите сделать какую-то анимацию, вы можете запустить таймер при нажатии клавиши (без l oop), затем анимировать при каждом тике таймера и, наконец, остановить анимацию при нажатии клавиши вверх.

Пример:

public partial class Form1 : Form
{
    private readonly Timer _timer = new Timer();
    private readonly string[] _messages =
        { "hello", "world", "", "folks", "we", "made", "it", "" };
    private int _index;

    public Form1()
    {
        InitializeComponent();

        _timer.Interval = 500; // Milliseconds
        _timer.Tick += Timer_Tick;
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        label1.Text = _messages[_index];
        _index = (_index + 1) % _messages.Length;
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.F6) {
            _timer.Start();
        }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        _timer.Stop();
        label1.Text = "stopped";
        _index = 0;
    }
}

Обратите внимание, что приложение всегда ожидает событий. Затем он обрабатывает событие и снова ждет. Мы говорим, что приложение winforms управляется событиями.

...