반응형
안녕하세요 제가 타이머를 초기화하는함수, 멈추는 함수와 실행하는 함수를 만들었는데요.
각각 버튼에 연결 시켜 누루면 실행되게 했습니다.
처음에 초기화 후 실행시킨 다음
멈춘 후 다시 init 을 안하고 실행하게 되면 오류가 나더라구요
어떻게 처리해 주어야할까요 .?
System.Threading.Timer ScadularTimer;
public void Macro_ScadualrTimerInit()
{
ScadularTimer = new System.Threading.Timer(CallBack);
}
public void Macro_ScadualrTimer()
{
ScadularTimer.Change(0, 1000);
}
void CallBack(Object state)
{
System.Diagnostics.Debug.Print("Hi");
}
public void Macro_stop()
{
ScadularTimer.Dispose();
}
이렇게 해도 상관없을까요 ?
public void Macro_ScadualrTimer()
{
ScadularTimer = new System.Threading.Timer(CallBack);
ScadularTimer.Change(0, 1000);
}
new로 계속 생성해도 Dispose()함수가 다 해제해주는건가요 ?
________________________________________________________________________
위의 질문에 대한 답변이자... 예제소스를 만들어봤습니다.
using System;
using System.Collections;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApplication7
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ArrayList Timers = new ArrayList();
System.Threading.Timer ScadularTimer;
/// <summary>
/// Init
/// </summary>
public void Macro_ScadualrTimerInit()
{
// All Stop
foreach (var timer in Timers)
{ ((System.Threading.Timer)timer).Change(Timeout.Infinite, Timeout.Infinite); }
Timers = new ArrayList();
// Running Stop
Macro_stop();
}
public void Macro_ScadualrTimer()
{
ScadularTimer.Change(0, 1000);
}
void CallBack(Object state)
{
System.Diagnostics.Debug.Print("Hi");
}
/// <summary>
/// Start
/// </summary>
public void Macro_start()
{
ScadularTimer = new System.Threading.Timer(CallBack);
Macro_ScadualrTimer();
// StartTimer Add to ArrayList
Timers.Add(ScadularTimer);
}
/// <summary>
/// Stop
/// </summary>
public void Macro_stop()
{
if (ScadularTimer != null)
{
ScadularTimer.Change(Timeout.Infinite, Timeout.Infinite);
}
}
/// <summary>
/// Start
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
Macro_start();
}
/// <summary>
/// Stop
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
Macro_stop();
}
/// <summary>
/// Init
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
Macro_ScadualrTimerInit();
}
}
}
버튼세개 만들었습니다.
버튼1 = Start
버튼2 = Stop
버튼3 = Init
Init 의 역활을 제가 잘못이해했는지 모르겠는데,
1. 스레드 전체를 멈춘다.
2. 객체를 초기화한다.
로 구현해보았습니다.
그리고 타이머의 초기화는
ScadularTimer.Change(Timeout.Infinite, Timeout.Infinite); <- 이런식으로 구현하시면 됩니다.
물론, 스레드 타이머이므로 객체에대한 접근이 가능해야 합니다.
전체 제어를 하기위해서는 어딘가에는 생성되는 스레드 객체의 인스턴스가 접근가능한 형태로 담겨있어야합니다. 제가 구현한 로직에서는 ArrayList 에 담아두는것으로 예제를 만들어봤습니다.
예제파일을 첨부합니다.
반응형
'C#' 카테고리의 다른 글
DataGridView 컨트롤의 수정모드제어 (0) | 2017.12.11 |
---|---|
[질문] 트리정보를 DB에 넣어 불러오고 싶은데 어떤식으로 해야할까요 .? (0) | 2016.12.05 |
TextBox에 숫자만 입력되도록 하는방법 (0) | 2016.04.18 |
커서의 위치를 취득하는 방법 (0) | 2013.01.28 |
Windows 서비스 응용 프로그램 디버깅 (0) | 2013.01.21 |