티스토리 툴바

달력

052012  이전 다음

  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  


Dictionary<Int32, String> risk = new Dictionary<int, string>();

private void test(){
  risk.Add(1, "Low");
  risk.Add(2, "Medium");
  risk.Add(3, "High");
  comboBox1.DataSource = new BindingSource(risk, null);
  comboBox1.DisplayMember = "Value";
  comboBox1.ValueMember = "Key";
  comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
}

private void cmbName_SelectedIndexChanged(object sender, EventArgs e)
{

}

[출처]http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3695ced1-18ea-4b85-93c8-2ed04bf22dc5

Posted by 불펭
http://network.hanbitbook.co.kr/view.php?bi_id=229
1. 쓰레드는 무엇인가?

http://network.hanbitbook.co.kr/view.php?bi_id=231
2. 다중 쓰레드

http://network.hanbitbook.co.kr/view.php?bi_id=233
3. 쓰레드 제어

http://network.hanbitbook.co.kr/view.php?bi_id=239
4. 쓰레드 기본 개념

http://network.hanbitbook.co.kr/view.php?bi_id=243
5. NT vs UNIX

http://network.hanbitbook.co.kr/view.php?bi_id=246
6. 쓰레드 예외 처리

http://network.hanbitbook.co.kr/view.php?bi_id=255
7. C#으로 만드는 WinTop

http://network.hanbitbook.co.kr/view.php?bi_id=318
8. 동기화

http://network.hanbitbook.co.kr/view.php?bi_id=330
9. 임계 영역

http://network.hanbitbook.co.kr/view.php?bi_id=332
10. 뮤텍스(Mutex)

http://network.hanbitbook.co.kr/view.php?bi_id=360
11. 이벤트(Event)

http://network.hanbitbook.co.kr/view.php?bi_id=377
12. 식사하는 철학자

http://network.hanbitbook.co.kr/view.php?bi_id=379
13. Interlocked, Heap

http://network.hanbitbook.co.kr/view.php?bi_id=426
14. 마지막 이야기

Posted by 불펭

Invoke, MethodInvoker, BeginInvoke - EndInvoke

UI Control들은 폼 구동시 실행되는 하나의 쓰레드에서 구동된다. 따라서 사용자가 실행시킨 쓰레드는 별도로 실행 되기 때문에 이 메인 쓰레드에 적절한 마샬링 없이 다른쓰레드에서 직접 접근하면 다른 쓰레드를 침범하는 것이다. (Cross Thread Problem) 이런 경우에는 프로그램이 개발자가 설계한대로 잘 동작하지 않을 수 있다.(Race Condition,DeadLock) 따라서, 안전하게 동작하게 하기위하여 .Net 환경에서는 Invoke를 제공하고 있다.

본 내용을 무시한 채 프로그램을 작성하면 InvalidOperationException을 발생시키고 . Debug 창에서 "컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다."라는 메세지가 표시 된다. 하지만 디버깅 환경이 아니라면 프로그램은 겉보기에 정상 동작하는 것 처럼 보일 수 있으므로 조심해야 된다. !

난 대충 좀 안되도 상관 없다고 생각하시는 분들은 이 예외를 비활성화 할 수도 있습니다.

CheckForIllegalCrossThreadCalls 속성 값을 false로 설정하여 이 예외를 비활성화할 수 있습니다. 그러면 컨트롤이 Visual Studio 2003에서와 같은 방식으로 실행됩니다.

자 그럼 쓰레드에서 안전하게 Windows Form control을 제어하게 하는 방법에 대해 알아보자

InvokerRequired 속성은 Invoke메쏘드를 호출해야되는지 알려준다.

Invoke

쓰레드에서 폼 컨트롤 하기 위해서는 별도의(SetTextononTextBox1) 메쏘드를 만들어 사용하면 좋다. 예를들어, Textbox에 값을 입력한다면 아래와 같은 'SetTextonTextBox1' 메쏘드를 만들어서 사용하면 Cross thread 환경이든 내부 쓰레드 사용환경에서든 둘다 사용할 수 있다.

Invoke를 사용할 때 인자를 넘겨줘야 하는 메쏘드 필요하면 할때는 반드시 delegate를 선언한 후에 사용하여야 한다.

  1. delegate void SetTextCallback(string txt);
    private void SetTextonTextBox1(string txt)
    {
    if (this.textBox1.InvokeRequired)
    {
    this.Invoke(new SetTextCallback(SetTxtCB), new object[] { txt }); //그냥 txt를 넘겨줘도 된다
    }
    else
    {
    this.textBox1.Text += txt;
    }
    }
    private void SetTxtCB(string txt)
    {
    this.textBox1.Text+=txt;
    }

인자가 없는 메쏘드를 호출할 때는 간단하게 MethodInvoker를 사용하면 좋다.

  1. private void SetTextonTextBox1(string txt)
    {
    if (this.textBox1.InvokeRequired)
    {
  2. this.Invoke(new MethodInvoker( delegate { this.textBox1.Text+=txt; }) );

    }
    else
    {
    this.textBox1.Text += txt;
    }
    }

BeginInvoke , EndInvoke

우선 BeginInvoke를 설명하기 전에 Windows Form 의 Control.BeginInvoke 메쏘드와 Delegate.BeginInvoke 메쏘드에 대해서 차이점을 설명하고 본 단락에서는 Winfows Form Control의 BeginInvoke만 설명하도록 하겠다.

Delegate.BeginInvoke는 Asynchronous Delegate를 만들어서 콜백을 하는 것이라고 생각하면 되겠다. 다시말해서, CLR에서 관리하는 쓰레드풀에서 해당 메쏘드를 큐잉한다. 쉽게 얘기해서 별도의 쓰레드를 만들어서 Delegate를 실행한다고 보면 된다. 장점은 IAsyncResult를 이용해서 Object 결과값을 넘겨 받을 수 있다. 보다 자세한 사항은 이곳을 참조!

Windows Form의 Control.BeginInvoke는 Control 내부 핸들이 작성된 쓰레드(메인쓰레드)에서 지정된 대리자를 비동기식으로 실행한다. 비동기식이므로 실행을 대기하지 않고 BeginInvoke는 즉시 Return 한다.

차이점을 정리 하자면 Control.BeginInvoke는 실행코드의 GUI Thread에 작성된 코드이고 Delegate.BeginInvoke는 쓰레드풀 쓰레드에 사용된다. 또한 Control.BeginInvoke의 경우는 EndInvoke를 호출하지 않아도 되나 Delegate.BeginInvoke의 경우는 반드시 Delegate.EndInvoke를 호출해줘야 한다 안그러면 메모리 릭이 발생한다.

  1. public delegate void InvokeDelegate();
  2. private void Invoke_Click(object sender, EventArgs e)
    {
    myTextBox.BeginInvoke(new InvokeDelegate(InvokeMethod));
    }
    public void InvokeMethod()
    {
    myTextBox.Text = "Executed the given delegate";
    }

Endinvoke

References
  1. http://msdn.microsoft.com/ko-kr/library/ms171728.aspx
  2. http://xmlangel.textcube.com/6
  3. http://jongkok4.net/entry/펌c-UI-쓰레드-마샬링-Invoke-BeginInvoke?TSSESSIONjongkok4net=6e5ec00b34c31e0126e9a64412f7a627
  4. http://timl.net/2008/01/begininvoke-methodinvoker-and-anonymous.html
  5. http://shiman.wordpress.com/2008/09/10/c-net-delegates-asynchronous-invocation-begininvoke-method/
  6. http://msdn.microsoft.com/ko-kr/library/0b1bf3y3(VS.80).aspx
  7. http://kristofverbiest.blogspot.com/2007/02/don-confuse-controlbegininvoke-with.html
  8. http://www.albahari.com/threading/#_Introduction
  9. http://www.yoda.arachsys.com/csharp/threadstart.html

Posted by 불펭

MS Visual Studio에서 제공하는 Chart component 이다.
Dundas chart의 이전 버전을 Microsoft에서 라이센스하여 제공한다고 하며, 무료로 사용 가능하다.


    [시스템 요구 사항 ]




  [그래프 종류]




1. 사전 필요사항
- MS Visual Studio 2008 SP1 (Visual Studio 2008 C# Express, Webdeveloper 2008 에서도  사용 가능)
Microsoft .NET Framework 3.5 SP1

2. 설치 파일
MSChart.exe
MSChart_VisualStudioAddOn.exe
DataVisChartControl.zip DataVisChartControl.z01
WebSamples.zip
WinSamples.zip WinSamples.z01 WinSamples.z02 WinSamples.z03

3. 설치방법
1) MSChart.exe 실행
2) MSChart_VisualStudioAddOn.exe 실행
3) VisualStudio 실행 후, 컨트롤을 도구 상자에 등록
 - 도구상자에 마우스를 갖다 대고, 오른쪽 메뉴에서 "항목 선택"을 클릭한다.

 - .NET Framework 구성요소 중에서 "Chart" 항목 2개를 check한 후에 "확인"버튼
   (Chart control의  Web form control과 Win form control 2개를 등록하여야 한다.)
 - 새 프로젝트의 Form designer에 Chart control을 끌어 당겨서 작업 진행

Posted by 불펭

< 설치 환경 >
Tomcat 7.0 : D:\Tomcat 7.0
WEB-INF : D:/workspace/WebContent/WEB-INF

(1) log4j-1.2.16.jar 파일을 Tomcat 경로의 lib 폴더에 저장.

 

 



(2) log4j.properies 의 파일을 WEB-INF/classes  에 저장.

로깅의 우선 순위에 따른 로깅 레벨이다.

FATAL > ERROR > WRN > INFO > DEBUG 

① FATAL : 가장 크리티컬한 에러가 일어 났을 때 사용합니다.
② ERROR : 일반 에러가 일어 났을 때 사용합니다.
③ WARN : 에러는 아니지만 주의할 필요가 있을 때 사용합니다.
④ INFO : 일반 정보를 나타낼 때 사용합니다.
⑤ DEBUG : 일반 정보를 상세히 나타낼 때 사용합니다.



 기타 참고 사이트
http://blog.naver.com/PostView.nhn?blogId=dalbong97&logNo=130021029647 

(log4j.properties)

 # 예제 : DEBUG ( login.java[doPost]:176) [2011-08-19 13:37:34,710] - MyTEST is GOOOOOOD!!!!
log4j.rootLogger = DEBUG, stdout, dailyfile
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p (%F[%M]:%L) [%d] - %m%n
log4j.appender.dailyfile.Threshold = DEBUG
log4j.appender.dailyfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyfile.File = c:/was.log
log4j.appender.dailyfile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyfile.layout.ConversionPattern=%5p (%F[%M]:%L) [%d] - %m%n



(간략한 예제 소스) - Servlet
 import org.apache.log4j.Logger;

public class login extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private static Logger logger = Logger.getLogger(login.class);  
 ....... (중략) ......

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
   logger.info("MyTEST is GOOOOOOD");
}

끝.

'프로그래밍 > JSP' 카테고리의 다른 글

Log4j 설정하기  (0) 2011/08/19
[JDOM] XML Parsing (특정 Element 값 불러오기)  (0) 2011/06/24
Java TCP Server/Client Socket program  (1) 2011/06/10
Posted by 불펭

public partial class Form1 : Form
{
        public Form1()
        {
            InitializeComponent();
        }
        private long Now = 0;
        private long End = 0;

        private void btnStart_Click(object sender, EventArgs e)
        {
            Now = System.DateTime.Now.Ticks;

            listBox1.Items.Add("NOW : " + Now.ToString());

        }

        private void btnEnd_Click(object sender, EventArgs e)
        {
            End = System.DateTime.Now.Ticks;
            listBox1.Items.Add("End : " + End.ToString());
            double timegap = (End - Now) / 10000000.0f;

            listBox1.Items.Add("Result : " + timegap.ToString());
        }
}

'프로그래밍 > C#' 카테고리의 다른 글

Invoke , BeginInvoke, MethodInvoker  (0) 2011/10/07
MS Chart Control  (0) 2011/08/19
[시간차구하기] 두 타임의 시간차 계산하기  (0) 2011/08/15
Array List 활용법(제너릭 클래스)  (0) 2011/07/04
C# 에서 UnixTimeStamp 를 사용하자  (0) 2011/06/07
C# 메모리 구조  (0) 2011/05/13
Posted by 불펭

 

제네릭(generic)이라고 아시나요? 

<> 안에 들어가는 것은 타입 이름이죠.
위에 나온 List 클래스를 MSDN 을 통해 살펴보면, 
List<T> 로 되어 있는 것을 알 수 있습니다.
참, 리스트는 자료 구조에서 사용되는 컬렉션의 한 종류입니다.
위에서, List<Vector2> 라고 했으면,
Vector2 타입의 개체들을 포함하는 리스트 컬렉션이라고 보면 되지요.

마찬가지로, List<int> 라고 했으면,
 

int 타입의 개체들을 포함하는 리스트 컬렉션이라고 보면 되지요. 

한 번더 연습해 볼까요? 

List<string> 라고 했으면, 

string 타입의 개체들을 포함하는 리스트 컬렉션이라고 보면 됩니다. 

List<Vector2> 타입이나, List<int> 타입, List<string> 타입은 

각기 다른 타입입니다. 

예를 들면, Vector2 타입이나 int 타입, string 타입이 저마다 다르듯이요.

그렇다면, 왜 제네릭을 구현했을까요? 

바로, 중복되는 구현을 간결화하기 위해서랍니다.

int 타입의 데이터들을 리스트 방식으로 관리하는 데이터 구조가 필요해서

intList 라는 클래스를 만들었다고 해 봅시다. 

이 클래스에는 int 타입의 데이터를 추가, 삭제, 변경, 조회 등의 작업을 수행하는 메소드를 

포함해야 합니다. 

이번에는,string 타입의 데이터들을 리스트 방식으로 관리하는 데이터 구조가 필요해서 stringList 라는 클래스를 만들었다고 해 봅시다. 

이 클래스에는 string 타입의 데이터를 추가, 삭제, 변경, 조회 등의 작업을 수행하는 메소드를 포함해야 합니다.
하지만, 이들 메소드의 구현사항은
 int 타입의 데이터를 추가, 삭제, 변경, 조회 등의 작업을 수행하는 메소드들의 구현사항과 거의 비슷할 것입니다. 

마찬가지로, Vector2 타입의 데이터들을 리스트 방식으로 관리하는 데이터 구조가 필요해서 
Vector2List 라는 클래스를 만들었다고 해 봅시다. 

이 클래스에는 Vector2 타입의 데이터를 추가, 삭제, 변경, 조회 등의 작업을 수행하는 메소드를 
포함해야 합니다. 하지만, 이들 메소드의 구현사항은
int 타입과 string 타입의 데이터를 추가, 삭제, 변경, 조회 등의 작업을 수행하는 메소드들의 구현사항과
거의 비슷할 것입니다.
이들 사이의 구현사항에는 변동사항이 거의 없으며, 다만 데이터들의 타입만 다를 뿐입니다.
이렇기 때문에, List<T> 라는 제네릭 클래스를 만들게 된 것이지요.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleTest
{
    public struct Addr
    {
        public string Name;
        public int Age;
    }

    class Program
    {
        public static void Main(string[] args)
        {
            List lst = new List();
            List addr = new List();

            lst.Add("C#");
            lst.Add("ASP.NET");
            lst.Insert(0, "HTML");

            for (int i = 0; i < lst.Count; i++)
            {
                Console.WriteLine(i+"==>" + lst[i]);
            }

            Addr a1 = new Addr();
            a1.Age = 21;
            a1.Name = "홍길동21";
            addr.Add(a1);
            a1.Age = 22;
            a1.Name = "홍길동22";
            addr.Add(a1);

            for (int i = 0; i < addr.Count; i++)
            {
                Console.WriteLine("{0} : {1}", addr[i].Name, addr[i].Age);
            }
        }
    }
}

'프로그래밍 > C#' 카테고리의 다른 글

MS Chart Control  (0) 2011/08/19
[시간차구하기] 두 타임의 시간차 계산하기  (0) 2011/08/15
Array List 활용법(제너릭 클래스)  (0) 2011/07/04
C# 에서 UnixTimeStamp 를 사용하자  (0) 2011/06/07
C# 메모리 구조  (0) 2011/05/13
IOCP 참고 자료들.  (0) 2011/05/13
Posted by 불펭

1. JDOM 을 다운로드 (http://www.jdom.org)
2. jdom-1.1.1.zip 을 압출을 풀면 jdom.jar 파일이 있음.
3. jdom.jar 파일을 %CATALINA_HOME%lib  폴더 안에 복사 후 톰캣 리스타트!!

[적용 예제 소스는 첨부]

'프로그래밍 > JSP' 카테고리의 다른 글

Log4j 설정하기  (0) 2011/08/19
[JDOM] XML Parsing (특정 Element 값 불러오기)  (0) 2011/06/24
Java TCP Server/Client Socket program  (1) 2011/06/10
Posted by 불펭

 

In this example you'll see how to create a client-server socket communication. The example below consist of two main classes, the ServerSocketExample and the ClientSocketExample. The server application listen to port 7777 at the localhost. When we send a message from the client application the server receive the message and send a reply to the client application. The communication in this example using the TCP socket, it means that there is a fixed connection line between the client application and the server application.
package org.kodejava.example.net;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.lang.Runnable;
import java.lang.Thread;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketExample {
    private ServerSocket server;
    private int port = 7777;

    public ServerSocketExample() {
        try {
            server = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ServerSocketExample example = new ServerSocketExample();
        example.handleConnection();
    }

    public void handleConnection() {
        System.out.println("Waiting for client message...");

        //
        // The server do a loop here to accept all connection initiated by the
        // client application.
        //
        while (true) {
            try {
                Socket socket = server.accept();
                new ConnectionHandler(socket);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class ConnectionHandler implements Runnable {
    private Socket socket;

    public ConnectionHandler(Socket socket) {
        this.socket = socket;

        Thread t = new Thread(this);
        t.start();
    }

    public void run() {
        try
        {
            //
            // Read a message sent by client application
            //
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            String message = (String) ois.readObject();
            System.out.println("Message Received: " + message);

            //
            // Send a response information to the client application
            //
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject("Hi...");

            ois.close();
            oos.close();
            socket.close();

            System.out.println("Waiting for client message...");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

package org.kodejava.example.net;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientSocketExample {
    public static void main(String[] args) {
        try {
            //
            // Create a connection to the server socket on the server application
            //
            InetAddress host = InetAddress.getLocalHost();
            Socket socket = new Socket(host.getHostName(), 7777);

            //
            // Send a message to the client application
            //
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject("Hello There...");

            //
            // Read and display the response message sent by server application
            //
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            String message = (String) ois.readObject();
            System.out.println("Message: " + message);

            ois.close();
            oos.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

[원문]http://www.kodejava.org/examples/216.html

'프로그래밍 > JSP' 카테고리의 다른 글

Log4j 설정하기  (0) 2011/08/19
[JDOM] XML Parsing (특정 Element 값 불러오기)  (0) 2011/06/24
Java TCP Server/Client Socket program  (1) 2011/06/10
Posted by 불펭
static DateTime ConvertFromUnixTimestamp(double timestamp)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return origin.AddSeconds(timestamp);
}


static double ConvertToUnixTimestamp(DateTime date)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    TimeSpan diff = date - origin;
    return Math.Floor(diff.TotalSeconds);
}

'프로그래밍 > C#' 카테고리의 다른 글

[시간차구하기] 두 타임의 시간차 계산하기  (0) 2011/08/15
Array List 활용법(제너릭 클래스)  (0) 2011/07/04
C# 에서 UnixTimeStamp 를 사용하자  (0) 2011/06/07
C# 메모리 구조  (0) 2011/05/13
IOCP 참고 자료들.  (0) 2011/05/13
MSSQL 연결편.  (0) 2011/05/13
Posted by 불펭