NGMsoftware

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

    학습


    C# C# .NET 매크로 프로그램 만들기. (매크로 중지 2부)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이전 시간에 클라이언트(에디터, 플레이어)에서 실행중인 매크로를 중지하는 방법을 알아봤는데요. 오늘은 스크립트 중지 액션을 만들어 볼께요. 아마도, 다음 시간에는 실행중인 스크립트를 일시 중지하는걸 만들거 같네요. 일단 스크립트를 제어하는 모델들을 모두 추가해놓고, BaseModel에 스크립트를 선택할 수 있도록 해두었습니다. 여기까지는 1부 내용을 참고하시면 됩니다.

     

    아래는 스크립트 중지 모델인데요. 추가적인 옵션들을 더 제공해야 할지 고민중입니다. 현재는 선택한 스크립트를 중지합니다. 만약, 중지할 스크립트가 서브 스크립트를 가지고 있으면 모든 서브 스크립트도 같이 중지합니다. 이렇게하려면 재귀적으로 서브 스크립트를 모두 가져와야 하는데요. 이 부분은 코드로 알아볼께요.

    using Ai.Interface;
    
    namespace Ai.Model.Action.Script
    {
        [Serializable]
        public class StopModel : BaseModel
        {
            public override string? Excute(Ai.Interface.IPlayer player)
            {
                string? id = base.Excute(player);
    
                if (!string.IsNullOrEmpty(SelectScriptFile))
                {
                    List<IPlayer> children = new List<IPlayer>();
                    Ai.Common.Helper.GetRecursiveChildPlayers(children, player, SelectScriptFile);
    
                    foreach (var child in children)
                        child.Stop();
                }
    
                return id;
            }
        }
    }

     

    Ai.Common.Helper.GetRecursiveChildPlayers 메소드는 플레이어가 가진 서브 스크립트들을 재귀적으로 모두 찾아줍니다.

    public static void GetRecursiveChildPlayers(List<IPlayer> players, IPlayer player, string playerId)
    {
        if (player.Children != null && player.Children.Count > 0)
        {
            foreach (var child in player.Children)
            {
                if (child.Children != null && player.Children.Count > 0)
                    GetRecursiveChildPlayers(players, child, playerId);
    
                if (child.Id == playerId)
                    players.Add(child);
            }
        }
    }

     

    기존에 Thread 방식으로 만든 엔지엠 매크로는 동일한 스레드가 수행될 수 없었습니다. 하지만, Task를 사용하면 동일한 작업을 동시에 수행할 수 있기 때문에 같은 스크립트가 여러개 실행될 수 있습니다. 이 때 모두 스크립트명이 동일하기 때문에 중지할 스크립트 하나를 특정할 수 없게됩니다. 따라서, 찾은 모든 서브 스크립트를 중지하도록 만들었는데요. 아마도, 몇가지 추가적인 옵션을 부여해서 좀 더 디테일한 작업이 가능하도록 만들어야 하겠습니다. 지금은 일단 넘어가죠^^

     

    이제 사용자가 선택한 스크립트를 중지할 수 있도록 해야 하는데요. IPlayer 인터페이스에 Stop 메소드를 하나 추가했습니다.

    using System.Collections.Concurrent;
    
    namespace Ai.Interface
    {
        public interface IPlayer
        {
            string Id { get; }
    
            void Play();
    
            void Stop();
    
            void Pause();
    
            IPlayer AddSubPlayer(string selectScriptFile);
        }
    }

     

    Player 클래스에서 Stop 메소드를 구현해야 합니다.

            public void Stop()
            {
                if (this.Children != null && this.Children.Count > 0)
                {
                    foreach (IPlayer child in this.Children)
                        child.Stop();
                }
    
                CTS.Cancel();
            }

     

    Stop 코드는 이전과 동일합니다. 1부에서 클라이언트의 중지 버튼을 누르면 플레이어의 Stop 메소드가 호출되기 때문입니다. 스크립트 중지 액션도 사용자가 선택한 스크립트를 찾아서 중지하도록 하니까요. 클라이언트는 시각적으로 실행중인 스크립트를 선택할 수 있습니다. 아래처럼요. 2개의 스크립트가 열려 있고 "마우스 순차 클릭.ngs" 스크립트가 선택되어 있습니다. 이처럼 클라이언트는 현재 선택된 스크립트를 알 수 있습니다.

    33KVO1H.png

     

     

    이전 시간에 만들었던 스크립트를 열고, 중지 액션을 추가한 후 지연 시간을 2초로 설정합니다.

    PgZYTCY.png

     

     

    매크로를 실행하면, 윈도우 바탕화면을 순차적으로 클릭하다가 2초 후 해당 스크립트를 중지시킵니다. 매인 스크립트는 중지되지 않았기 때문에 마지막 클릭 액션이 동작하고 모든 스크립트가 완료됩니다. 만약, 스크립트 중지 버튼을 클릭하면 동시에 같이 중지되게 됩니다.

     

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.