반응형
Main 에서 DB 데이타를 검색하여 많은 양의 데이타를 화면에 업데이트 해야한다.
그렇게 하다보니 DB 연결하여 데이타를 가져오는 시점에서 시간이 걸려 화면이
멈추게 된다. 그래서 Main 스레드와 분리해 DB 엑세스 부분은 새로운 스레드를 만들어
검색해오게 했다. 그러면 DB 엑세스 스레드는 Asynch 가 되기때문에 완료시점을 메인에
알려줘야 화면상에 DB 에서 가져온 데이타를 업데이트 할수 있다.
이런 일련의 과정은 다음과 같다.
1. 검색 클릭
2. 데이타 검색 스레드 생성
3. 데이타 검색 스레드 함수 호출
4. 검색 함수에서 event 호출
5. event 함수에서 업데이트 할 리스트의 BeginInvoke 호출
6. BeginInvoke 인자로 넘긴 delegate 에 등록된 함수 실행
7. 완료
이것이 진행되기 위해선 event 등록을 위한 정의를 해줘야한다.
그렇게 하다보니 DB 연결하여 데이타를 가져오는 시점에서 시간이 걸려 화면이
멈추게 된다. 그래서 Main 스레드와 분리해 DB 엑세스 부분은 새로운 스레드를 만들어
검색해오게 했다. 그러면 DB 엑세스 스레드는 Asynch 가 되기때문에 완료시점을 메인에
알려줘야 화면상에 DB 에서 가져온 데이타를 업데이트 할수 있다.
이런 일련의 과정은 다음과 같다.
1. 검색 클릭
2. 데이타 검색 스레드 생성
3. 데이타 검색 스레드 함수 호출
4. 검색 함수에서 event 호출
5. event 함수에서 업데이트 할 리스트의 BeginInvoke 호출
6. BeginInvoke 인자로 넘긴 delegate 에 등록된 함수 실행
7. 완료
이것이 진행되기 위해선 event 등록을 위한 정의를 해줘야한다.
public delegate void PreviewHandler(object sender, EventArgs e); public event PreviewHandler Preview;
그리고 리스트에서 BeginInvoke 실행을 위한 인자 delegate 를 정의해야한다.
///다음은 위의 내용을 전개한 소스이다 .컨트롤이 쓸 Invoke delegate public delegate void InvokeDelegate(ArrayList data);
public delegate void PreviewHandler(object sender, EventArgs e); public event PreviewHandler Preview; private Access access; ///컨트롤이 쓸 Invoke delegate public delegate void InvokeDelegate(ArrayList data); ///DB 데이타 검색을 위한 thread Thread Workstart; public Main() { InitializeComponent(); } private void btnSearch_Click(object sender, EventArgs e) { if (txtSearch.Text.Length > 0) { // 새로 생성된 쓰레드에서 작업할 내용 Workstart = new Thread(new ThreadStart(GetData)); Workstart.Priority = ThreadPriority.Lowest; Workstart.IsBackground = true; Workstart.Start(); } else //글자 입력안했을시.. { this.txtSearch.Focus(); MessageBox.Show("추가할 문장을 넣어주십시요"); } } ////// Main 화면이 로딩될때 Access 를 연결하고 관리하는 클래스 생성한다. /// 그리고 Access 와 연결하는 함수를 호출한다. /// /// /// private void Main_Load(object sender, EventArgs e) { // 프로그램을 위한 객체 초기화 access = new Access(); access.Connect(); // DB 엑세스 되고 나면 전달할 이벤트 this.Preview += new PreviewHandler(ControlEventMethod); } ////// DB 엑세스 이후에 이벤트 발생시 실행되는 함수 /// /// /// public void ControlEventMethod(object sender, EventArgs e) { if (lstTitle.InvokeRequired) { InvokeDelegate del = new InvokeDelegate(InvokeController); lstTitle.BeginInvoke(del, (ArrayList) sender); } } public void InvokeController(ArrayList arrData) { int count = 0; foreach (string str in arrData) // 출력을 위한 for each 문. { string temp; count++; temp = count.ToString(); if (str.Length > 5) { temp = str.Substring(5) + "..."; } else { temp = str; } lstTitle.Items.Add(temp); System.Threading.Thread.Sleep(2); Application.DoEvents(); } } public void GetData() { string sqlselect = "SELECT ID, 식물명ID, 질병ID, 민간요법처방 FROM [소분류(처방)]"; ArrayList data = access.Select(sqlselect); this.Preview(data, null); } ////// 메인 화면이 닫힐때 호출된다. /// 1. Access 연결 객체를 닫는다 /// /// /// private void Main_FormClosing(object sender, FormClosingEventArgs e) { // DB 연결 종료 access.DisConncect(); // 스레드 실행중이라면 강제 종료 if (Workstart != null) { if (Workstart.ThreadState == ThreadState.Running) { Workstart.Abort(); } } }
반응형
'기타 언어 > C# & MFC' 카테고리의 다른 글
탐색기에 나와있는 간단한 TreeView, ListView 구현예제 (0) | 2009.04.14 |
---|---|
탐색기에 나와있는 간단한 TreeView 구현예제 (0) | 2009.04.12 |
C# 에서 ActiveX Control 간단하게 만들어보기 (0) | 2009.04.07 |
C# 에서의 Thread class (0) | 2009.03.21 |
List 나 Grid 등에 대량의 데이터를 업로드 할 때 화면멈춤 해결하기 (0) | 2009.03.19 |
C# 에서 Thread Safe 의 2가지 사용법 (0) | 2009.03.19 |
delegate 간단하게 사용설명과 예제를 보여준다. (2) | 2009.03.18 |
Error while trying to run project : Unable to start debugging 잘못된 바인딩핸들입니다 - 에러 (0) | 2009.03.18 |