1. WPF자체의 타이머가 이닌 Windows.Form의 타이머를 사용하는 방법
using System.Windows.Forms;
// Timer개체를 생성, 속성, 이벤트 정의
timer = new Timer();
timer.Interval = 200;
timer.Tick += new EventHandler(timer_Tick);
timer.Enabled = true;
// 타이머의 Tick 이벤트
private void timer_Tick(object sender, EventArgs e)
{
DrawClock();
}
// Timer개체를 생성, 속성, 이벤트 정의
timer = new Timer();
timer.Interval = 200;
timer.Tick += new EventHandler(timer_Tick);
timer.Enabled = true;
// 타이머의 Tick 이벤트
private void timer_Tick(object sender, EventArgs e)
{
DrawClock();
}
/// 이코드는 Shape로 만들어진 시계의 시, 분, 초 침을 현재 시간에 맞추어
/// 각도를 조정하는 코드이다.
/// 첨부한 샘플을 참고하라.
/// <summary>
/// 시침, 분침, 초침 그리기
/// </summary>
private void DrawClock()
{
DateTime now = DateTime.Now;
txtTime.Text = now.ToLongTimeString();
int hour = now.Hour;
int minute = now.Minute;
int second = now.Second;
/// 각도를 조정하는 코드이다.
/// 첨부한 샘플을 참고하라.
/// <summary>
/// 시침, 분침, 초침 그리기
/// </summary>
private void DrawClock()
{
DateTime now = DateTime.Now;
txtTime.Text = now.ToLongTimeString();
int hour = now.Hour;
int minute = now.Minute;
int second = now.Second;
double hourAngle = hour * 30 + minute * 0.5;
double minuteAngle = minute * 6 + second * 0.1;
double secondAngle = second * 6;
double minuteAngle = minute * 6 + second * 0.1;
double secondAngle = second * 6;
rotateHour.Angle = hourAngle;
rtHour.RenderTransform = rotateHour;
rtHour.RenderTransform = rotateHour;
rotateMinute.Angle = minuteAngle;
rtMinute.RenderTransform = rotateMinute;
rtMinute.RenderTransform = rotateMinute;
rotateSecond.Angle = secondAngle;
rtSecond.RenderTransform = rotateSecond;
}
rtSecond.RenderTransform = rotateSecond;
}
2. WPF자체의 타이머를 사용하는 방법
이것은 윈폼용과 동일하게 동작합니다.
이벤트도 같구요. 다만, Enabled가 이니라 Start(), Stop()이네요.
public DispatcherTimer Timer = new DispatcherTimer();
void Window1_Loaded(object sender, RoutedEventArgs e)
{
Timer.Interval = TimeSpan.FromSeconds(3);
Timer.Tick += new EventHandler(Timer_Tick);
Timer.Start();
}
void Window1_Loaded(object sender, RoutedEventArgs e)
{
Timer.Interval = TimeSpan.FromSeconds(3);
Timer.Tick += new EventHandler(Timer_Tick);
Timer.Start();
}
3. 별도의 쓰레드를 만들어 동작하는 타이머를 사용하는 방법
Thread로 동작하는 것 같더군요. 따라서, 폼 개체에 접근할 수 없습니다.
this 라던가.. 폼 개체에 접근하려면 에러가 발생합니다.
사용방법은 using System.Timers; 를 추가하고 그냥 사용하시면 됩니다.
다만, Tick 이벤트가 아니라
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
Elapsed 이벤트를 사용합니다. 이벤트 핸들러도 다릅니다.
참고하세요.
this 라던가.. 폼 개체에 접근하려면 에러가 발생합니다.
사용방법은 using System.Timers; 를 추가하고 그냥 사용하시면 됩니다.
다만, Tick 이벤트가 아니라
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
Elapsed 이벤트를 사용합니다. 이벤트 핸들러도 다릅니다.
참고하세요.
System.Timers.Timer Class는 TestWindow와 다른 새로운 Thread를 생성해서 동작을 합니다.
System.Windows.Threading.DispatcherTimer는 TestWindow와 같은 Thread에서 동작을 합니다.
WPF용으로는 두가지의 타이머가 있습니다.
System.Windows.Threading.DispatcherTimer는 TestWindow와 같은 Thread에서 동작을 합니다.
WPF용으로는 두가지의 타이머가 있습니다.
이 두가지 타이머간에는 다음과 같은 차이점이 존재합니다..
Dispatcher Class
- 같은 Thread에서 동작하기 때문에 동기화 작업이 필요없고, TestWindow의 멤버도
자유롭게 접근 가능합니다.
Dispatcher Class
- 같은 Thread에서 동작하기 때문에 동기화 작업이 필요없고, TestWindow의 멤버도
자유롭게 접근 가능합니다.
Timer Class
- 서로 다른 Thread에서 동작하기 때문에 TestWindow의 멤버변수에 직접 접근을 할수 없습니다.
(직접 접근을 하기 위해서는 Invoke나 BeginInvoke를 사용하여야 합니다)
- 서로 다른 Thread에서 동작하기 때문에 List를 추가/삭제 하기 위해서는 추가적으로 Thread간
동기화 작업을 해줘야 합니다.
- 서로 다른 Thread에서 동작하기 때문에 TestWindow의 멤버변수에 직접 접근을 할수 없습니다.
(직접 접근을 하기 위해서는 Invoke나 BeginInvoke를 사용하여야 합니다)
- 서로 다른 Thread에서 동작하기 때문에 List를 추가/삭제 하기 위해서는 추가적으로 Thread간
동기화 작업을 해줘야 합니다.
댓글 없음:
댓글 쓰기