반응형
C# System.Threading클래스의 사용법 2부
1부: thread 지정 + 상태확인
Timer Class: 일정 주기로 쓰레드를 실행하는 방법 정리.
예제
-. TimerCallback 델리게이트를 구현한 CheckStatus를 포함한 StatusChecker 클래스를 이용해서 메서드를 반복 실행하는 예제. AutoResetEvent 클래스를 이용한다.
class StatusChecker //StatusChecker Class 정의
{
private int invokeCount;
private int maxCount;
public StatusChecker(int count)
{
invokeCount = 0;
maxCount = count;
}
// timer delegate로 호출됨.
public void CheckStatus(Object stateInfo)
{
AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
Console.WriteLine("{0} Checking status {1,2}.",
DateTime.Now.ToString("h:mm:ss.fff"),
(++invokeCount).ToString());
if (invokeCount == maxCount)
{
invokeCount = 0;
autoEvent.Set();
}
}
}
private void Btn_ThreadTimer_Click(object sender, RoutedEventArgs e)
{
var autoEvent = new AutoResetEvent(false);
var statusChecker = new StatusChecker(10);
Console.WriteLine("{0:h:mm:ss.fff} Creating timer.\n", DateTime.Now);
var stateTimer = new Timer(statusChecker.CheckStatus, autoEvent, 1000, 250);
autoEvent.WaitOne();
stateTimer.Change(0, 500);
Console.WriteLine("\nChanging period to .5 seconds.\n");
autoEvent.WaitOne();
stateTimer.Dispose();
Console.WriteLine("\nDestroying timer.");
}
----------출력----------
10:56:53.608 Creating timer.
10:56:54.613 Checking status 1.
10:56:54.864 Checking status 2.
10:56:55.115 Checking status 3.
10:56:55.366 Checking status 4.
10:56:55.617 Checking status 5.
10:56:55.868 Checking status 6.
10:56:56.118 Checking status 7.
10:56:56.369 Checking status 8.
10:56:56.620 Checking status 9.
10:56:56.871 Checking status 10.
Changing period to .5 seconds.
10:56:56.871 Checking status 1.
10:56:57.372 Checking status 2.
10:56:57.872 Checking status 3.
10:56:58.373 Checking status 4.
10:56:58.874 Checking status 5.
10:56:59.374 Checking status 6.
10:56:59.875 Checking status 7.
10:57:00.376 Checking status 8.
10:57:00.876 Checking status 9.
10:57:01.377 Checking status 10.
Destroying timer.
상세설명
StatusChecker class
-. 변수 정의
private int invokeCount; // 매 스레드 진행회수 체크
private int maxCount; // 스레드 반복회수. maxCount만큼 진행 후 스레드 정지
-. 클래스 생성 시 입력변수
public StatusChecker(int count)
{
invokeCount = 0; // 처음 클래스 생성 시 0으로 설정
maxCount = count; // 클래스 생성 시 전달받음. (이 예제에서는 10)
}
-. Timer 델리게이트로 호출되는 메서드 CheckStatus
public void CheckStatus(Object stateInfo)
{
AutoResetEvent autoEvent = (AutoResetEvent)stateInfo; // AutoResetEvent 클래스 변수들 입력
Console.WriteLine("{0} Checking status {1,2}.", DateTime.Now.ToString("h:mm:ss.fff"), (++invokeCount).ToString());
if (invokeCount == maxCount)
{
invokeCount = 0; // 카운터 리셋
autoEvent.Set(); // 타이머에 신호 전달 (나 완료됐어요)
}
}
Timer 델리게이트 생성 및 호출
-. 클래스 선언
var autoEvent = new AutoResetEvent(false); // 오토리셋이벤트 클래스 호출, false 입력 시 타이머 콜백 대기 (동기화)
var statusChecker = new StatusChecker(10); // 10회 반복 설정
-. 타이머 생성
var stateTimer = new Timer(statusChecker.CheckStatus, autoEvent, 1000, 250); // 타이머 델리게이트 선언 Timer(콜백, 오토리셋이벤트, 시작 전 대기시간, 주기);
-. 타이머 실행 대기 및 삭제
autoEvent.WaitOne(); // 타이머에서 Set 실행 대기
stateTimer.Dispose(); // 타이머 삭제
728x90
반응형
'C#' 카테고리의 다른 글
user32.dll + listbox - 프로세스 목록 정렬/선택 (0) | 2021.10.19 |
---|---|
[C#] 이미지파일 읽기 + 출력 (Bitmapimage, ImageDrawing) (0) | 2021.01.03 |
[OpenCV] OpenCvSharp4 - 캡쳐 화면 클릭해서 좌표 얻기 (0) | 2020.11.05 |
[C#] Thread - thread 지정 + 상태확인 (0) | 2020.11.01 |
[C#] 화면캡쳐 + 출력 (OpenCvSharp4) (0) | 2020.10.22 |
최근댓글