Остановка таймера C# после некоторого количества тиков автоматически
Как остановить таймер после некоторого количества тиков или, скажем, через 3-4 секунды?
поэтому я запускаю таймер, и я хочу после 10 тиков или через 2-3 секунды автоматически остановиться.
спасибо!
5 ответов
вы можете держать счетчик, как
int counter = 0;
затем в каждом ТИКе вы увеличиваете его. После вашего предела вы можете остановить таймер. Сделайте это в своем тиковом событии
counter++;
if(counter ==10) //or whatever your limit is
yourtimer.Stop();
при достижении заданного интервала таймера (через 3 секунды), timer1_Tick()
будет вызван обработчик событий, и вы можете остановить таймер в обработчике событий.
Timer timer1 = new Timer();
timer1.Interval = 3000;
timer1.Enabled = true;
timer1.Tick += new System.EventHandler(timer1_Tick);
void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop(); // or timer1.Enabled = false;
}
Я вообще говорю, потому что вы не упомянули, какой таймер, но у всех есть тики... Итак:
вам понадобится счетчик в классе как
int count;
который вы инициализируете в начале своего таймера, и вам понадобится dateTime, как
DateTime start;
который вы инициализируете в начале своего таймера:
start = DateTime.Now;
и в вашем методе тика вы будете делать:
if(count++ == 10 || (DateTime.Now - start).TotalSeconds > 2)
timer.stop()
вот пример
public partial class meClass : Form
{
private System.Windows.Forms.Timer t;
private int count;
private DateTime start;
public meClass()
{
t = new Timer();
t.Interval = 50;
t.Tick += new EventHandler(t_Tick);
count = 0;
start = DateTime.Now;
t.Start();
}
void t_Tick(object sender, EventArgs e)
{
if (count++ >= 10 || (DateTime.Now - start).TotalSeconds > 10)
{
t.Stop();
}
// do your stuff
}
}
Если вы используете System.Windows.Forms.Tick
. Вы можете отслеживать счетчик и время, когда он живет так. Его хороший способ использовать свойство Tag таймера.
Это делает его многоразовым для других таймеров и сохраняет общий код вместо использования глобально определенного int counter
для каждого таймера.
этот код является тихим общим, поскольку вы можете назначить этот обработчик событий для управления временем его жизни, а другой обработчик событий для обработки определенных действий, созданных таймером для.
System.Windows.Forms.Timer ExampleTimer = new System.Windows.Forms.Timer();
ExampleTimer.Tag = new CustomTimerStruct
{
Counter = 0,
StartDateTime = DateTime.Now,
MaximumSecondsToLive = 10,
MaximumTicksToLive = 4
};
//Note the order of assigning the handlers. As this is the order they are executed.
ExampleTimer.Tick += Generic_Tick;
ExampleTimer.Tick += Work_Tick;
ExampleTimer.Interval = 1;
ExampleTimer.Start();
public struct CustomTimerStruct
{
public uint Counter;
public DateTime StartDateTime;
public uint MaximumSecondsToLive;
public uint MaximumTicksToLive;
}
void Generic_Tick(object sender, EventArgs e)
{
System.Windows.Forms.Timer thisTimer = sender as System.Windows.Forms.Timer;
CustomTimerStruct TimerInfo = (CustomTimerStruct)thisTimer.Tag;
TimerInfo.Counter++;
//Stop the timer based on its number of ticks
if (TimerInfo.Counter > TimerInfo.MaximumTicksToLive) thisTimer.Stop();
//Stops the timer based on the time its alive
if (DateTime.Now.Subtract(TimerInfo.StartDateTime).TotalSeconds > TimerInfo.MaximumSecondsToLive) thisTimer.Stop();
}
void Work_Tick(object sender, EventArgs e)
{
//Do work specifically for this timer
}
при инициализации таймера установите значение тега в 0 (ноль).
tmrAutoStop.Tag = 0;
потом, с каждым тиком добавить один...
tmrAutoStop.Tag = int.Parse(tmrAutoStop.Tag.ToString()) + 1;
и проверьте, достиг ли он желаемого номера:
if (int.Parse(tmrAutoStop.Tag.ToString()) >= 10)
{
//do timer cleanup
}
используйте эту же технику, чтобы чередовать событие, связанное с таймером:
if (int.Parse(tmrAutoStop.Tag.ToString()) % 2 == 0)
{
//do something...
}
else
{
//do something else...
}
чтобы проверить прошедшее время (в секундах):
int m = int.Parse(tmrAutoStop.Tag.ToString()) * (1000 / tmrAutoStop.Interval);