NGMsoftware

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

    학습


    C# C# .NET 매크로 프로그램 만들기. (시작 시간 액션 2부)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 시작 시간 액션 1부에 이어서 2부에서는 비동기 처리에 대해 알아보도록 하겠습니다. 우선, 엔지엠 매크로 6 버전의 이벤트와 동일한 방식으로 사용할 수 있는데요. 엔지엠 최신 버전에서는 더이상 이벤트를 제공하지 않고, 비동기 처리를 별도로 수행할 수 있는 방법을 제공합니다. 그리고, 그룹 액션의 비동기를 통해 동일하게 구현하는 방법도 알아보겠습니다.

     

    기존 StartDateTimeModel에 비동기로 동작하기 위한 속성을 하나 추가해야 합니다. 백그라운드에서 시작 시간을 검사하면서 매인 스크립트는 계속 자기가 할일을 해야 합니다. 그리고, 시작 시간이 되면 아래에 있는 액션으로 이동하는게 아닌 사용자가 설정한 아이디로 점프하는 방식입니다.

    [LocalizedCategory("Action")]
    [LocalizedDisplayName("GotoID")]
    [LocalizedDescription("GotoID")]
    [Browsable(true)]
    [DefaultValue(null)]
    [TypeConverter(typeof(TypeConverter.ActionIdConverter))]
    public string? GotoID { get; set; }

     

    이 속성을 사용하기 위해 Execute 메소드를 아래와 같이 수정해야 합니다.

    if (string.IsNullOrEmpty(GotoID))
    {
        while (System.DateTime.Now.ToString("yyyyMMddHHmmss") != dt?.ToString("yyyyMMddHHmmss"))
        {
            if (player.CT.IsCancellationRequested)
                break;
    
            Task task = Task.Delay(1, player.CT);
    
            try
            {
                task.Wait(player.CT);
            }
            catch
            {
                break;
            }
        }
    }
    else
    {
        if (!Ai.Common.Helper.NullCheckAndWriteLine(player, nameof(this.ID), this.ID))
            return id;
    
        Task.Run(() =>
        {
            while (System.DateTime.Now.ToString("yyyyMMddHHmmss") != dt?.ToString("yyyyMMddHHmmss"))
            {
                if (player.CT.IsCancellationRequested)
                    break;
    
                Task task = Task.Delay(1, player.CT);
    
                try
                {
                    task.Wait(player.CT);
                }
                catch
                {
                    break;
                }
            }
    
            player.SetForceGotoId(GotoID);
        }, player.CT);
    }

     

    GotoID가 빈 값이 아니라면 비동기로 실행하도록 태스크를 실행합니다. 그리고, 태스크가 동작하면 스크립트가 멈출 때 같이 종료시켜야 하기 때문에 CancellationToken을 등록해야 합니다. 만약, GotoID가 없다면 기존처럼 동작할 수 있도록 로직을 분기했습니다.

     

    이제, 시작 시간 액션에 GotoID를 설정하면 태스크가 만들어지고 백그라운드에서 시간을 비교합니다. 비교 시간과 동일하면 아래 메소드로 이동할 아이디를 플레이어에 설정합니다.

    player.SetForceGotoId(GotoID);

     

    플레이어에서 매크로가 실행될 때 GotoID가 있으면 해당 로직으로 바로 이동할 수 있도록 코드를 변경해줍니다.

    K2rTk7R.jpeg

     

    GotoID 메소드는 actions 목록에서 이동해야 할 액션의 인덱스를 반환합니다.

    ZRevzO6.jpeg

     

    나중에 For 반복과 Foreach 반복 루틴에서도 정상적으로 동작하는지 테스트를 해봐야겠지만, 지금은 1차원적인 테스트만 진행해보고 정상 여부를 판단하겠습니다. 노말 테스트는 아래와 같습니다. 이 스크립트의 시나리오는 시작 시간이 되면 그룹 c로 이동하고, 마우스 클릭한 다음에 스크립트가 완료됩니다. 시작 시간 액션에 이동할 아이디가 설정되어 있어서 비동기로 실행됩니다. 따라서, 그룹 b와 액션 이동이 무한 반복합니다. 시작 시간이 되면 그룹 c로 이동합니다.

    u7tkYBy.jpeg

     

     

    비동기 처리를 그룹 액션이 담당할수도 있습니다. 일단 시작 시간 액션을 동기로 실행하도록 합니다. 동기로 실행하려면 액션 이동 아이디가 없으면 됩니다.

    r67iNlU.jpeg

     

     

    그룹을 비동기로 설정해야 동일하게 작동됩니다.

    I72zWjK.jpeg

     

     

    위의 2가지 시나리오를 실행해보면 아래 동영상처럼 동일하게 작동하는걸 확인할 수 있습니다.

     

     

    다양한 조건 또는 로직에 따라서 비동기 처리를 해야 한다면 그룹 액션을 사용하는게 더 좋습니다. 그룹안에 백그라운드로 뭔가 체크하면서 다른 작업을 해야 하거나 여러개의 작업을 동시에 수행해야 한다면 그룹의 비동기 설정을 이용해보세요. 병렬로 처리해야 하는 것들이 많을수록 컴퓨터의 성능 및 속도가 저하되겠지만, 적절하게 잘 사용한다면 컴퓨터의 리소스를 100프로 활용해서 훨씬 더 쾌적하게 작업이 가능합니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.