2012년 8월 3일 금요일

델리게이트 + invoke + 스레드 생성 (스레드 메인폼 메세지 전달)

// 메인 폼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace DelTest
{
    public partial class MainForm : Form
    {
        private ReceiverClass _clsReceiver;
        private Thread _thReceive;

        public MainForm()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _clsReceiver = new ReceiverClass(this);
            OutPutMsg("클래스 생성");
            _thReceive = new Thread(new ThreadStart(_clsReceiver.Start));
            OutPutMsg("스레드 생성");
            _thReceive.Start();
            OutPutMsg("스레드 실행");
        }


        // 메세지 출력
        public void OutPutMsg(string strMsg)
        {
            listView1.Items.Add(strMsg);
        }

        // 종료시 스레드 종료후 종료
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (_thReceive != null)
            {
                while (_thReceive.ThreadState != ThreadState.Stopped)
                {
                    _clsReceiver.Stop();
                }
            }
        }
    }
}
// 클래스
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelTest
{
    class ReceiverClass
    {
        public delegate void DgMsgEvtSend(string strMsg);
        private bool _shouldStop;
        private MainForm _mainForm;

        // 생성자
        public ReceiverClass(MainForm mainForm)
        {
            _mainForm = mainForm;
            _shouldStop = true;
        }


        public void Stop()
        {
            MsgRun("스레드 정지 명령을 보냅니다.");
            _shouldStop = false;
        }


        public void Start()
        {
            while (_shouldStop)
            {
                MsgRun("스레드 메세지를 보냅니다.");
                System.Threading.Thread.Sleep(1000);
            }
        }

        // 메세지 invoke 처리
        private void MsgRun(string strMsg)
        {
            _mainForm.Invoke(new DgMsgEvtSend(_mainForm.OutPutMsg), strMsg);
        }
    }
}

댓글 없음:

댓글 쓰기