Please Enable JavaScript!
Gon[ Enable JavaScript ]

반응형
Main 에서 DB 데이타를 검색하여 많은 양의 데이타를 화면에 업데이트 해야한다.
그렇게 하다보니 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();
        }
    }
}
반응형
Posted by 녹두장군1
,