퇴근5분전


 WPF 에 프로그래스 바를 사용할때!! 무거워서일까낭..?? 프로그래스에 진행도가 제대로 표현되지 않아서
쓰레드를 보았다.

아래 소스는 두가지를 주안점으로 했다.

첫번째 대리자 비동기 호출은 데브피아에서 비동기 구현관련해서 강좌를 보고 ...
           ( 전에 공부했던 내용이었는데 기억이 안나는건... )

두번째 Thread내에서의 Invoke를 이용해 대리자로써 메서드를 위임하는 부분이 WPF에서는 어찌 되는가를 알아보았다.

# 막상 Invoke를 써보니 Winform과 크게 다른건 없다. Dispatcher라는 프로퍼티에 Invoke를 이용할뿐이다.

 TextBox, Button, ProgressBar   이렇게 구성되어 있다.

   /// <summary>
    /// Window1.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        public delegate void delegateSetTextRender(object i, int cnt);
        public void SetTextRender(object i, int cnt)
        {
            textBox1.AppendText(i.ToString() + "\r\n");
            progressBar1.Value = cnt;
        }

        public void INProgressValue(int Progress)
        {
            progressBar1.Value = Progress;
        }
        public void INProgressMaxValue(int Progress)
        {
            progressBar1.Maximum = Progress;
        }
        public void INProgressMinValue(int Progress)
        {
            progressBar1.Minimum = Progress;
        }


        public delegate void delegateProgress(int i);

        const int SEARCHCOUNT = 20000;

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            // 기본쓰레드로 할때 
            //Thread th = new Thread(new ThreadStart( DoEvent ));
            //th.Start();

            // 비동기로 구현할 때.
               Action ac = new Action(DoEvent);
            AsyncCallback  async = new AsyncCallback(_EndInvoke);
            IAsyncResult ir =  ac.BeginInvoke(async, ac);

        }

        void _EndInvoke( IAsyncResult iar )
        {
           Action ac = iar.AsyncState as Action;
           while (iar.IsCompleted == false)
           {
               Thread.Sleep(100);
           }
           ac.EndInvoke(iar);
       
        }

        /// <summary>
        /// ///////////////////////////////////////////////////
        /// </summary>
        void DoEvent()
        {
            this.Dispatcher.Invoke(new delegateProgress(INProgressValue), new object[] { 0 });
            this.Dispatcher.Invoke(new delegateProgress(INProgressMaxValue),
                                                                                       new object[] { SEARCHCOUNT });
            this.Dispatcher.Invoke(new delegateProgress(INProgressMinValue), new object[] { 0 });


            List<int> sosuList = new List<int>();
            sosuList.Add(2);

            // 검사대상수 1과 2는 건너뜀...
            int number = 3;
        

            // 소수 3만개 찾기위한 루프
            while (sosuList.Count <= SEARCHCOUNT)
            {
                // 소수 검사 결과 일단은 소수라고 의심
                bool result = true;

                // 소수 검사
                double stopNumber = Math.Sqrt(number);
                foreach (int i in sosuList)
                {
                    if ((number % i) == 0)
                    {
                        result = false;
                        break;
                    }
                    if (i > stopNumber) break;
                }
              
                // 진짜 소수면 리스트에 저장
                if (result)
                {
                    this.Dispatcher.Invoke(new delegateProgress(INProgressValue),
                                                                                   new object[] { sosuList.Count });
                    sosuList.Add(number);
                }

                // 검사대상 수 증가
                number++;

                // 검사수에 제한을 둠
                if (number > 20000000) break;
            }

           // this.Dispatcher.Invoke(new delegateProgress(INProgressValue),new object[] { 0 });
            // 추가적으로 파라미터 Thread !!를 구현하는 방법이다.
            Thread th = new Thread(new ParameterizedThreadStart(Dispaly));
          th.Start(sosuList);
                    
        }

        void Dispaly(object prms)
        {
            IList<int> sosuList = prms as IList<int>;
            int cnt = sosuList.Count;
            foreach (int val in sosuList)
            {
                 this.Dispatcher.Invoke(new delegateSetTextRender(SetTextRender),
                                                                                           new object[] { val, --cnt });
               // this.textBox1.AppendText(val.ToString() + "\r\n");
            }
        }
    }

'# 3) .Net ( Vs 2008 ) > WPF' 카테고리의 다른 글

FlexGrid : WPF 콤보 컬럼 (Combo Column Type)  (0) 2010.09.07
IValueConverter 사용 데모  (0) 2010.09.06
[WPF] Tab 순환코드  (0) 2010.07.27
툴을 제작 해서 프로젝트를... 진행하다!  (0) 2010.02.26
WPF 3D  (0) 2009.12.29