Время от времени я сталкиваюсь с этим вопросом. Пример использования и пример, который мне нравится, это:
jeffs@jeffs-desktop:/home/jeffs $ python36
Python 3.6.1 (default, Sep 7 2017, 16:36:03)
[GCC 6.3.0 20170406] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cmath
>>> print(cmath.sqrt(-4))
2j
>>>
>>> dir(cmath)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e', 'exp', 'inf', 'infj', 'isclose', 'isfinite', 'isinf', 'isnan', 'log', 'log10', 'nan', 'nanj', 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau']
>>>
Не имеет смысла создавать объект класса cmath, потому что в CMAT-объекте нет состояния. Однако cmath - это совокупность методов, которые в какой-то мере связаны. В моем примере выше все функции в cmath в некотором роде действуют на сложные числа.
Это можно сделать без явного использования 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();
}
}
Вы можете отключить его и включить с помощью task.Delay (). Продолжить с(). Это создает новый поток, который запускается после задержки. Вы должны сделать его безопасным для потоков, winforms не является безопасным для потоков самостоятельно
Вы должны использовать Timer.SynchronizationObject
Короткий ответ
Из кода, который вы разместили, действительно только кажется, что вам нужно изменить код на , отключить флажок в событии 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();
}
}