NGMsoftware

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

    학습


    C# C# .NET 매크로 프로그램 만들기. (지연 또는 딜레이 액션)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 엔지엠 매크로에는 기본적으로 모든 액션들이 지연 및 랜덤 지연을 설정할 수 있는 속성들이 있습니다. 액션이 실행되기 전과 실행된 후에 설정이 가능한데요. 스크립트에 액션들은 순차적으로 실행되기 때문에 실행 후 지연과 다음 액션의 실행 전 지연은 동일해 보이지만, 프로세스적으로 생각해보면 다르다고 할 수 있습니다. 아래와 같은 스크립트가 있다고 생각 해볼께요.

    5xsgKBk.jpeg

     

     

    바탕화면에 있는 아이콘을 위에서부터 하나씩 순차적으로 클릭하는데요. 전부 실행 전 지연이 설정되어 있습니다. 이 때 첫번째가 실행되고, 두번째가 실행될 때 중지를 누르면 첫번째 액션이 실행되고 중지를 눌렀지만, 두번째 액션도 실행되고 중지됩니다. 이렇게 동작하는 이유는 첫번째 액션이 실행된 후 이미 두번째 액션이 실행된 상태에서 지연되고 있는 상태입니다. 중지가 예약되어 있지만, 두번째 액션이 실행된 후 예약된 중지가 동작하게 됩니다.

     

    이번에는 전부 실행 후 지연에 지연 시간을 설정하고, 첫번째 클릭 후 중지를 눌러보면 이번에는 두번째 클릭이 실행되지 않고 중지되는걸 확인할 수 있습니다. 엔지엠 6에서는 중지를 누르면 바로 중지가 동작하는데요. 이는 스레드를 강제로 중지시키도록 했기 때문입니다. 이렇게하면 여러가지 문제가 발생하게 됩니다. 마이크로소프트에서도 스레드를 강제로 중지시키기 보다는 안정적으로 중지할 수 있도록 가이드하고 있습니다.

     

    하나의 액션은 실행 전 지연과 자신의 동작 후 실행 후 지연을 수행합니다. 동작과 지연이 합쳐져 있다보니 3개의 행위가 모두 완료되어야 다음에 종료할 수 있습니다. 그렇기 때문에 액션을 분리하기 위해서 지연 액션이 별도로 필요합니다. 이외에도 다양한 환경에 유연하게 대처하기 위해서 분리된 지연 액션이 필요합니다.

     

    날짜와 시간 관련 액션들을 모아둘 폴더를 하나 만들고, DelayModel을 추가했습니다.

    sUAXDAE.jpeg

     

     

    지연 액션은 아래와 같은 속성을 가지고 있습니다. 다른 액션들이 실행전 지연과 실행 후 지연으로 가지고 있는 속성입니다.

    [LocalizedCategory("Action")]
    [LocalizedDisplayName("UseRandomDelay")]
    [LocalizedDescription("UseRandomDateTime")]
    [Browsable(true)]
    [DefaultValue(false)]
    public new bool UseRandomDelay { get; set; }
    
    /// <summary>
    /// 액션을 식별할 수 있는 유니크한 아이디를 설정합니다.
    /// </summary>
    [LocalizedCategory("Action")]
    [LocalizedDisplayName("RandomMinDelay")]
    [LocalizedDescription("RandomMinDelay")]
    [Browsable(true)]
    [DefaultValue(0)]
    public new int RandomMinDelay { get; set; }
    
    [LocalizedCategory("Action")]
    [LocalizedDisplayName("Delay")]
    [LocalizedDescription("BeforeDelay")]
    [Browsable(true)]
    [DefaultValue(0)]
    public new int BeforeDelay { get; set; }
    
    [LocalizedCategory("Action")]
    [LocalizedDisplayName("UseSpecialRandomDelay")]
    [LocalizedDescription("UseSpecialRandom")]
    [Browsable(true)]
    [DefaultValue(false)]
    public bool UseSpecialRandomDelay { get; set; }

     

    실행 코드는 간단합니다. 몇줄 되지 않는데요. 중요한 부분은 CancellationToken 처리 부분입니다.

    public override string? Execute(IPlayer player)
    {
        var id = base.Execute(player);
    
        Task task = Task.Delay(Common.Helper.Delay(RandomMinDelay, BeforeDelay, UseRandomDelay, UseSpecialRandomDelay), player.CT);
    
        try
        {
            task.Wait();
        }
        catch
        {
            return id;
        }
    
        return id;
    }

     

    가능한 작업 취소를 처리하기 위해 TaskFactory 개체에 전달되는 취소 토큰을 생성하는 CancellationTokenSource 개체를 인스턴스화합니다 . 그러면 TaskFactory 객체는 취소 토큰을 특정 기기에 대한 판독값 수집을 담당하는 각 작업에 전달합니다. TaskFactory.ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken) 메서드는 모든 판독값이 성공적으로 수집된 후에만 평균이 계산되도록 호출됩니다. 작업이 취소되어 완료되지 않은 경우 TaskFactory.ContinueWhenAll 메서드는 예외를 발생시킵니다.

     

    CancellationToken을 사용하면 스레드, 스레드풀 작업 항목 또는 Task 개체 간의 협력 취소가 가능합니다. CancellationTokenSource.Token 속성에서 검색된 취소 토큰을 관리하는 CancellationTokenSource 개체를 인스턴스화하여 취소 토큰을 만듭니다 . 그런 다음 취소 알림을 받아야 하는 스레드, 작업 또는 작업 수에 취소 토큰을 전달합니다. 취소를 시작하는데 토큰을 사용할 수 없습니다. 소유 개체가 CancellationTokenSource.Cancel을 호출하면 취소 토큰의 모든 복사본에 대한 IsCancellationRequested 속성이 True로 설정 됩니다 . 알림을 받은 개체는 적절한 방식으로 응답할 수 있도록 메서드를 구성해야 합니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.