C#에서 초마다 정확하게 수행하는 타이머??!!

2024. 4. 5. 14:23·사소한 아이의 소소한 스킬/C#
반응형

우리가 개발을 하다보면 멀티 스레드환경으로 꼭 개발이 들어가게 된다.

 

특히나 UI를 만지다 보면 필수...

 

WPF에서는 특히나 Single Thread 환경이기에 UI Thread에 대한 처리가 꼭 필요하다.

 

MVVM으로 처리를 한다면 백그라운드에서 알아서 잘 해주기에 많은 신경은 안써주어도 알아서 바인딩되서 착착 UI에 업데이트되지만?

 

아무튼.

 

이러한 상황에서 1초마다 Timer를 발생시키는 System.Timer 요녀석을 통해 매 초 특정 기능을 수행하려고 한다.

 

허나 System.Timer는 오차가 존재한다는 점.

 

윈도우 응용프로그램은 하드웨어 클락? 을 이용치 않기에 오차가 무조건 존재하고 나는 그 오차가 +-0.000몇초차이로 존재하며 앞뒤로 있을 것이라 생각했지만 왠걸...

 

 

 

요런식으로 쌓이기만한다....

 

이거는 생각못했는데 말이지.......

 

아무튼 이러한 문제가 있기에 몇시간을 켜두거나 며칠을 켜두게 되면 특정 초는 수행이 되지 않는 문제가 발생할 것이다!!!

 

그렇다면 이러한 문제 해결은 어찌 해야 하는가...

 

답은

 

 

Multimedia Timer

 

멀티미디어 타이머라는것이 존재한다.

 

 

NuGet에서는 .NET Core를 위해서 해당 기능이 있다곤 하지만, 해당 기능을 가지고 확장한 .NET Framework 용도 있다.

 

아무튼 그래서 나는 찾은게 

 

PrecisionTimer

 

 

친히 Nuget에 존재한다.

 

그냥 받고서 적용시켜서 실행하면 끝..

 

실행 코드 간단히 말하면

 

using System;
using System.Windows;
using System.Threading;
using System.Runtime.InteropServices;

using PrecisionTiming;


namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {

        public static PrecisionTimer MyTimer = new PrecisionTimer();

        // 윈도우 응용프로그램이기에 Console창을 띄워주기 위해 만들었다.
        static class NativeMethods
        {
            [DllImport("kernel32.dll", SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool AllocConsole();
        }

        public MainWindow()
        {
            InitializeComponent();

            // Console창 만들기
            NativeMethods.AllocConsole();

            MyTimer.SetInterval(Test, 1000);
            MyTimer.Start(1000);

        }

        public void Test()
        {
            Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff"));

            Random RR = new Random();

            // 임의로 Sleep 걸어서 수행시간 늘리기
            Thread.Sleep(RR.Next(0, 500));
        }
    }
}

 

응용프로그램 켜지자 마자 timer 생성하고 1초마다 잘 찍히는지 Console찍고.

 

혹여나 처리 시간이 길어져도 해당 시간을 유지하는지 체크하기 위해서 Sleep구문도 랜덤으로 작성.

 

해당 기능으로 구현해서 확인해보면

 

 

System.Timer와는 다르게 잘 유지되는것을 알 수 있다.

 

만약 초마다 정확하게 1번씩 실행되는 타이머등을 이용하고 싶다면 MultimediaTimer를 사용하자!!

반응형
저작자표시 비영리 변경금지 (새창열림)
'사소한 아이의 소소한 스킬/C#' 카테고리의 다른 글
  • WPF 프로그램에서의 Python 실행 방법
  • C# Excel 사용법.
  • WCF (Window Communication Foundation)
  • WPF 버전 WCF 예제파일
JOOJI
JOOJI
그냥 혼자좋아하는 것들 남기는 블로그....
  • JOOJI
    사소한프로그래머의 소소한행복
    JOOJI
  • 전체
    오늘
    어제
    • 분류 전체보기 (951) N
      • 사소한 아이의 소소한 일상 (245)
      • 사소한 아이의 소소한 먹거리 (43)
      • 사소한 아이의 소소한 정보 (75) N
      • 사소한 아이의 소소한 감사 (4)
      • 사소한 아이의 소소한 운동 (53) N
      • 사소한 아이의 소소한 여행 (40)
        • 2013_전주 (1)
        • 2014_독일 (13)
        • 2014_군산 (1)
        • 2015_제주도 (3)
        • 2015_서울모토쇼 (3)
        • 2015_진해 (1)
        • 2015_전주 (1)
        • 2016_여수 (1)
        • 2020_강릉 (1)
        • 2022_제주도 (4)
      • 사소한 아이의 소소한 강짱 (22)
        • 하트투하트 (10)
        • MAPS (1)
        • 화려한 유혹 (2)
        • 한여름의 추억 (2)
      • 사소한 아이의 TV (50)
        • Drama (9)
        • 예능 (32)
        • 사소한 아이의 다현 (9)
      • 사소한 아이의 소소한 스킬 (130)
        • Scaleform (2)
        • C# (74)
        • QT (3)
        • 알고리즘 (4)
        • Python (21)
        • PyQT5 (9)
        • C_C++ (2)
      • 사소한 아이의 소소한 축구 (283)
        • Korea (25)
        • Germany (45)
        • Bayern Munich (64)
        • Soccer_ETC (75)
        • Euro 2016 (12)
        • 친선경기 (3)
      • 사소한 아이의 소소한 생활정보 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
    • 관리
  • 링크

    • 독일여행
    • 레바티스토리
    • 프라치노 공간
    • 남성패션꿀템 블로그
  • 공지사항

  • 인기 글

  • 태그

    WPF
    러닝
    회사밥
    c#
    뮌헨
    바이에른 뮌헨
    python
    독일
    분데스리가
    문제
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
JOOJI
C#에서 초마다 정확하게 수행하는 타이머??!!

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.