[BeginInvoke] Delegate 로 스레드에 매개변수 전달하기



보통 스레드를

Thread t = new Thread( new ThreadStrat(Method) );

의 형태로 사용 하는데 Method 에 매개변수를 전달하지 못한다는 제약이 있다.

그래서  delegate 의 BeginInvoke 메소드를 통해 스레드를 작성해보자.




Created with colorer-take5 library. Type 'csharp'

/*
 * SharpDevelop으로 작성��었습니다.
 * 사용자: jjongun
 * 날짜: 2010-02-04
 * 시간: ��후 4:48
 * 
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Diagnostics;

namespace testSockerServer
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        //스레드로 만들 델리게이트 선언
        delegate void runDele(string str);
        public MainForm()
        {    
            InitializeComponent();
            
            Trace.WriteLine("��제 메인 스레드 id: " +Thread.CurrentThread.ManagedThreadId);
            
            //델리게이트 생성
            runDele d = new MainForm.runDele(this.initServer);
            //BeginInvoke 로 매개변�� 전달
            d.BeginInvoke("string value",null,null);
        }
        
        private void initServer(string str)
        {
            Trace.WriteLine("델리게이트로 만든 스레드 id: " +Thread.CurrentThread.ManagedThreadId +"\n"
                           +str);
        }
    }
}

/**
 *   출력 : 
 * 
 *  ��제 메인 스레드 id: 1
 *    델리게이트로 만든 스레드 id: 3
 *     string value
 *  
 * */
Yamecoder 야매코더_
C# 2010.12.04 00:11

[Windows form Invoke] System.Timers.Timer 로 windows form 접근하기


http://blog.daum.net/starkcb/117

를 보면 System.Timers.Timer (이하 시스템타이머) 로 윈도우 폼에 접근이 안된다는것을 확인할수 있다.

하지만  Invoke메서드 를 이용한 본인의 삽질끝에 발견했다.


SharpDeveloper 사용




Created with colorer-take5 library. Type 'csharp'

/*
 * System.Timers.Timer 로 windows form  접근��기 
 * lang : c#
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Timers;
using System.Diagnostics;

namespace test
{
    public partial class MainForm : Form
    {
        //��Invoke 를 위한 델리게이트 선언��
        private delegate void transDelegate(string srt);
        
        private TextBox tx = new TextBox();
        private System.Timers.Timer tm;
        
        //델리게이트�� 인스턴스
        private transDelegate d;
        private int testnum = 0;
        
        public MainForm()
        {
            InitializeComponent();        
            
            //간단한 textbox 생성
            tx.SetBounds(0,0,this.Width , this.Height);
            tx.Multiline = true;
            Controls.Add(tx);
            
            //프로그램 종료시 이벤트 등록
            this.Disposed += new EventHandler(MainForm_Disposed);
            
            //시스템 타이머 메소드
            testTimer();
        }
        

        private void MainForm_Disposed(object sender, EventArgs e)
        {
            Trace.WriteLine("exit");
            tm.Stop();
        }
        
        
        private void testTimer()
        {
            //타이머�� 선언과 활용
            tm= new System.Timers.Timer();            
            tm.Interval = 100;
            tm.Start();
            //타이머이벤트 등록
            tm.Elapsed += new ElapsedEventHandler(tm_Elapsed);
            
            //델리게이트�� 활용
            d = new MainForm.transDelegate(tx.AppendText);
        }
        
        
        private void tm_Elapsed(object sender, ElapsedEventArgs e)
        {
            //Invoke 활용 ( 타겟 , 타겟에 대한 매개변��);
            Invoke(d , "sec :  "+testnum +"\r\n");
            testnum ++;
        }
    }
}
Yamecoder 야매코더_
C# 2010.12.04 00:09
Powerd by Tistory, designed by criuce
rss