|
Прокачайте класс - Вопросы и ответы, обсуждения - Ваши вопросы по C# только в данном разделе |
31.03.2013, 18:23
|
#1
|
|
|
|
Рыцарь-капитан
|
Регистрация: 29.01.2010
Сообщений: 547
Популярность: 41279
Сказал(а) спасибо: 692
Поблагодарили 2,270 раз(а) в 1,035 сообщениях
|
Прокачайте класс
Написал небольшой класс "будильника", но жопой чую что что-то здесь не так.
Код:
static void Main(string[] args)
{
DateTime startTime =DateTime.Parse("31.03.2013 20:00:07");
DateTime endTime = DateTime.Parse("1.04.2013 6:30:02");
pTime t = new pTime();
t.startTime = startTime;
t.endTime = endTime;
t.OnStart += sender => { Console.WriteLine("OnStart {0} лечь спать",DateTime.Now);/*BEEEEP();*/};
t.OnStop += sender => { Console.WriteLine("OnStop {0} проснуться", DateTime.Now); /*BEEEEP();*/ };
t.Start();
Console.WriteLine("Vse");
Console.Read();
}
Сам класс
Код:
internal class pTime
{
private DateTime _startTime; //время начала
private DateTime _endTime; //время окончания
private Thread _myThread;
public delegate void pTimeEventHandler(object Sender);
/// <summary>
/// оповещение о начале отсчета
/// </summary>
public event pTimeEventHandler OnStart;
/// <summary>
/// оповещение о окончании отсчета
/// </summary>
public event pTimeEventHandler OnStop;
/// <summary>
/// время начала
/// </summary>
public DateTime startTime
{
set { _startTime = value; }
get { return _startTime; }
}
/// <summary>
/// время окончания
/// </summary>
public DateTime endTime
{
set { _endTime = value; }
get { return _endTime; }
}
public pTime()
{
_myThread = new Thread(pTimerStart);
}
public pTime(DateTime startTime, DateTime endTime)
{
_startTime = startTime;
_endTime = endTime;
_myThread = new Thread(pTimerStart);
}
private void pTimerStart()
{
IF30day:
DateTime currentTime = DateTime.Now; //текущее время
// если время начала больше времени окончания
// или текущее время больше времени окончания
if ((_startTime > _endTime) || (currentTime > endTime)) return;
int sleepTime = 0;
// если текущее время больше или равно времени начала
if (currentTime >= _startTime)
{
OnStart.Invoke(this);
sleepTime = Convert.ToInt32((_endTime.Ticks - currentTime.Ticks) / TimeSpan.TicksPerMillisecond);
Thread.Sleep(sleepTime);
}
else
{
sleepTime = Convert.ToInt32((startTime.Ticks - currentTime.Ticks) / TimeSpan.TicksPerMillisecond);
Thread.Sleep(sleepTime);
goto IF30day;
}
OnStop.Invoke(this);
}
public void Start()
{
// if ((_myThread.ThreadState == ThreadState.Running) || (_myThread.ThreadState == ThreadState.WaitSleepJoin)) return;
if (!_myThread.IsAlive)
{
_myThread.Start();
}
}
public void Stop()
{
// if ((_myThread.ThreadState != ThreadState.Running) || (_myThread.ThreadState != ThreadState.WaitSleepJoin)) return;
if (_myThread.IsAlive)
{
_myThread.Abort();
}
}
}
|
|
|
31.03.2013, 19:33
|
#2
|
|
|
|
Рыцарь-лейтенант
|
Регистрация: 24.06.2010
Сообщений: 406
Популярность: 14404
Золото Zhyk.Ru: 112
Сказал(а) спасибо: 336
Поблагодарили 1,039 раз(а) в 595 сообщениях
|
Re: Прокачайте класс
Pimp my class
|
|
|
31.03.2013, 20:20
|
#3
|
|
|
|
Сержант
|
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: Прокачайте класс
Месяц в int не запихнешь, а вот перегрузка под TimeSpan у Thread.Sleep есть.
Код:
Thread.Sleep(currentTime - _startTime);
Легким движением руки мы избавляемся от костыля
Добавлено через 15 минут
Очень хреновая практика, для событий обычно инвокаторы пишутся, по типу такого
Код:
private void OnStart()
{
var handler = OnStart;
if(handler != null)
handler(this);
}
Ибо если на событие не подписаться, но при этом попытаться вызвать его то получим NullReferenceException.
А еще паблик методы принято называть с заглавной буквы, так же как и типы, безо всяких префкисов p/T/etc, единственное исключение интерфейсы, они начинаются с заглавной i
ЗЫ Про label/goto я вообще молчу, и не понимаю зачем он там нужен О_о
________________
Talk is cheap. Show me the code
— Linus Torvalds
Последний раз редактировалось Yukikaze; 31.03.2013 в 20:37.
Причина: Добавлено сообщение
|
|
|
Пользователь сказал cпасибо:
|
|
01.04.2013, 11:46
|
#4
|
|
|
|
Рыцарь-капитан
|
Регистрация: 29.01.2010
Сообщений: 547
Популярность: 41279
Сказал(а) спасибо: 692
Поблагодарили 2,270 раз(а) в 1,035 сообщениях
|
Re: Прокачайте класс
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 01:43.
|
|