NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET 매크로 프로그램 만들기. (비동기 타이머 만들기)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이전 시간에 타이머에 대해서 알아봤는데요. 오늘은 비동기 타이머에 대해서 추가 개발을 해볼께요. 타이머의 핵심 기능은 타이머가 등록된 후 얼마의 시간이 흐른뒤에 동작할지를 결정하는겁니다. 그래서, 타이머 체크 액션과 중복되는 속성들이 다수 포함되어 있습니다. 아직 타이머 체크 액션을 만들지는 않았지만, 다음 글에서 보면 비슷한 내용들이 많을거예요.

     

    우선, 이전 글을 참고해서 타이머 모델을 하나 만들어줍니다. 그리고, 아래와 같이 비동기로 실행될 때 독립적으로 체크할 수 있는 속성을 추가하세요.

    [LocalizedCategory("Asynchronous")]
    [LocalizedDisplayName("UseAsynchronous")]
    [LocalizedDescription("UseAsynchronous")]
    [Browsable(true)]
    [DefaultValue(false)]
    public bool UseAsynchronous { get; set; }
    
    [LocalizedCategory("Asynchronous")]
    [LocalizedDisplayName("TimerTime")]
    [LocalizedDescription("TimerTime")]
    [Browsable(true)]
    [DefaultValue("1")]
    public string TimerTime { get; set; } = "1";
    
    [LocalizedCategory("Asynchronous")]
    [LocalizedDisplayName("GotoID")]
    [LocalizedDescription("GotoID")]
    [Browsable(true)]
    [DefaultValue(null)]
    [TypeConverter(typeof(TypeConverter.ActionIdConverter))]
    public string? GotoID { get; set; }

     

    아래 그림과 같이 타이머를 비동기로 설정하고, 5초 후 b 액션으로 이동하게 설정하세요. 타이머가 비동기라서 그룹 a와 액션 이동이 무한으로 반복하다가 5초가 되면 그룹 b로 이동하게 됩니다. 그룹 b가 스크립트의 마지막이라서 매크로는 자동으로 종료됩니다.

    AQnWVPA.jpeg

     

     

    매크로를 실행하면 아래와 같이 5초 후 그룹 b로 이동하고, 매크로는 종료됩니다.

    iaNcrFw.jpeg

     

     

    로그를 보면 좀 더 명확하게 확인이 가능합니다.

    Welcome to NGMsoftware!
    http://ngmsoftware.com
    [timer] 스크립트를 실행했습니다.
    타이머
    결과 값:null
    
    그룹 [a]
    액션 이동
    그룹 [a]
    액션 이동
    그룹 [a]
    액션 이동
    그룹 [a]
    액션 이동
    그룹 [a]
    그룹 [b]
    [timer] 스크립트가 완료되었습니다.

     

    에디터의 출력창에 시간을 표시하도록 하고, 로그를 찍어봤는데요. 아래와 같이 1초마다 한번씩 그룹 a가 실행되고, 5초에 완료되는걸 확인할 수 있습니다.

    [2024-04-24 19:54:43.885] [timer] 스크립트를 실행했습니다.
    [2024-04-24 19:54:43.897] 타이머
    [2024-04-24 19:54:43.911] 결과 값:null
    
    [2024-04-24 19:54:43.926] 그룹 [a]
    [2024-04-24 19:54:44.924] 액션 이동
    [2024-04-24 19:54:44.941] 그룹 [a]
    [2024-04-24 19:54:45.972] 액션 이동
    [2024-04-24 19:54:45.985] 그룹 [a]
    [2024-04-24 19:54:47.019] 액션 이동
    [2024-04-24 19:54:47.028] 그룹 [a]
    [2024-04-24 19:54:48.035] 액션 이동
    [2024-04-24 19:54:48.053] 그룹 [a]
    [2024-04-24 19:54:49.094] 그룹 [b]
    [2024-04-24 19:54:49.115] [timer] 스크립트가 완료되었습니다.

     

    비동기로 동작시키는 핵심 로직은 태스크입니다. 플레이어의 태스크 매니저에 타이머 태스크를 등록해줍니다. 그리고, 나중에 필요할지 몰라서 모든 태스크에 CancelationToken을 추가하고 있는데요. 태스크를 구분하고, 관리하기 위한 정보는 TaskInfo 클래스에 속성으로 만들어져 있습니다.

    player.Tasks.Add(taskName, new TaskInfo(Task.Run(() =>
    {
        while (true)
        {
            if (ct.IsCancellationRequested)
                break;
    
            System.DateTime current = System.DateTime.Now;
    
            if (current > left)
            {
                Result = current.ToString("yyyy-MM-dd HH:mm:ss.fff");
                player.SetForceGotoId(gotoID);
                break;
            }
    
            Task task = Task.Delay(1, ct);
    
            try
            {
                task.Wait(ct);
            }
            catch
            {
                break;
            }
        }
    
        Result = left.ToString("yyyy-MM-dd HH:mm:ss.fff");
    }, ct), ActionType.Timer, cts, ct));

     

    동기, 비동기 타이머 액션에 대해서 간단하게만 알아봤는데요. 다음에는 타이머 체크 조건 액션을 만들어서 동기적으로 어떻게 처리하는지도 알아보겠습니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.