Когда флажок снят, отключить его в течение определенного времени C # - PullRequest
0 голосов
/ 16 января 2019

Я работаю над антивирусной программой и на панели защиты в режиме реального времени. Я хочу установить флажок, например, если флажок «Защита от вредоносных программ» снят, чтобы он не включался в течение примерно 15 минут, а после этого снова включается, что предотвращает спам , Если кто-то может мне помочь, было бы здорово

Я пытался с Thread.Sleep(), но он останавливает все приложение, и я пытался с таймером, но я думаю, что сделал это неправильно.

Это код для таймера

private void checkBox1_CheckStateChanged(object sender, EventArgs e)
{
    if (this.checkBox1.Checked)
    {
        this.checkBox1.Text = "On";
        // these two pictureboxes are for "You are (not) protected"
        // picture
        picturebox1.Show();
        pictureBox5.Hide();
        timer1.Stop();
    }
    else
    {
        this.checkBox1.Text = "Off";
        // this is the problem
        timer1.Start();
        this.checkBox1.Enabled = true;
        pictureBox1.Hide();
        pictureBox5.Show();
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
    this.checkBox1.Enabled = false;
}

Ответы [ 4 ]

0 голосов
/ 16 января 2019

Это можно сделать без явного использования Timer. Вместо этого используйте асинхронный Task.Delay, который упростит код и облегчит понимание реальных / доменных намерений.

// Create extension method for better readability
public class ControlExtensions
{
    public static Task DisableForSeconds(int seconds)
    {
        control.Enabled = false;
        await Task.Delay(seconds * 1000);
        control.Enabled = true;
    }
}

private void checkBox1_CheckStateChanged(object sender, EventArgs e)
{
    var checkbox = (CheckBox)sender;
    if (checkbox.Checked)
    {
        checkbox.Text = "On";
        picturebox1.Show();
        pictureBox5.Hide();
    }
    else
    {
        checkbox.Text = "Off";
        checkbox.DisableForSeconds(15 * 60);
        pictureBox1.Hide();
        pictureBox5.Show();
    }
}
0 голосов
/ 16 января 2019

Вы можете отключить и включить его с помощью task.Delay (). Продолжить с(). Это создает новый поток, который запускается после задержки. Вы должны сделать его безопасным для потоков, winforms не является безопасным для потоков

0 голосов
/ 16 января 2019

Короткий ответ

Из кода, который вы разместили, действительно только кажется, что вам нужно изменить код на отключить флажок в событии CheckChanged и включить в timer1_Tick событие (а также Stop таймер в событии Tick).

Полный ответ

Winforms имеет Timer элемент управления, который вы можете использовать для этого. После добавления Timer в конструктор установите для свойства Interval количество миллисекунд, которое вы хотите подождать, прежде чем активировать флажок (1 секунда - 1000 миллисекунды, поэтому 15 минут - 15 мин * 60 сек / мин * 1000 мс / сек или 900,000 мс). Затем дважды щелкните его, чтобы создать обработчик события Tick (или добавьте его в ваше событие Form_Load, как я делал ниже).

Далее, в событии CheckChanged, если флажок не установлен, отключите флажок и запустите таймер.

Затем в событии Tick просто установите флажок (помните, что это событие срабатывает после того, как прошло Interval миллисекунд) и остановите таймер.

Например:

private void Form1_Load(object sender, EventArgs e)
{
    // These could also be done in through designer & property window instead
    timer1.Tick += timer1_Tick; // Hook up the Tick event
    timer1.Interval = (int) TimeSpan.FromMinutes(15).TotalMilliseconds; // Set the Interval
}

private void timer1_Tick(object sender, EventArgs e)
{
    // When the Interval amount of time has elapsed, enable the checkbox and stop the timer
    checkBox1.Enabled = true;
    timer1.Stop();
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if (!checkBox1.Checked)
    {
        // When the checkbox is unchecked, disable it and start the timer
        checkBox1.Enabled = false;
        timer1.Start();
    }
}
0 голосов
/ 16 января 2019

Вы должны использовать Timer.SynchronizationObject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...