WPF 쓰레드 ( 프로그래스바 )
WPF 에 프로그래스 바를 사용할때!! 무거워서일까낭..?? 프로그래스에 진행도가 제대로 표현되지 않아서
쓰레드를 보았다.
아래 소스는 두가지를 주안점으로 했다.
첫번째 대리자 비동기 호출은 데브피아에서 비동기 구현관련해서 강좌를 보고 ...
( 전에 공부했던 내용이었는데 기억이 안나는건... )
두번째 Thread내에서의 Invoke를 이용해 대리자로써 메서드를 위임하는 부분이 WPF에서는 어찌 되는가를 알아보았다.
# 막상 Invoke를 써보니 Winform과 크게 다른건 없다. Dispatcher라는 프로퍼티에 Invoke를 이용할뿐이다.
TextBox, Button, ProgressBar 이렇게 구성되어 있다.
/// <summary>
/// Window1.xaml에 대한 상호 작용 논리
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
public delegate void delegateSetTextRender(object i, int cnt);
public void SetTextRender(object i, int cnt)
{
textBox1.AppendText(i.ToString() + "\r\n");
progressBar1.Value = cnt;
}
public void INProgressValue(int Progress)
{
progressBar1.Value = Progress;
}
public void INProgressMaxValue(int Progress)
{
progressBar1.Maximum = Progress;
}
public void INProgressMinValue(int Progress)
{
progressBar1.Minimum = Progress;
}
public delegate void delegateProgress(int i);
const int SEARCHCOUNT = 20000;
private void button1_Click(object sender, RoutedEventArgs e)
{
// 기본쓰레드로 할때
//Thread th = new Thread(new ThreadStart( DoEvent ));
//th.Start();
// 비동기로 구현할 때.
Action ac = new Action(DoEvent);
AsyncCallback async = new AsyncCallback(_EndInvoke);
IAsyncResult ir = ac.BeginInvoke(async, ac);
}
void _EndInvoke( IAsyncResult iar )
{
Action ac = iar.AsyncState as Action;
while (iar.IsCompleted == false)
{
Thread.Sleep(100);
}
ac.EndInvoke(iar);
}
/// <summary>
/// ///////////////////////////////////////////////////
/// </summary>
void DoEvent()
{
this.Dispatcher.Invoke(new delegateProgress(INProgressValue), new object[] { 0 });
this.Dispatcher.Invoke(new delegateProgress(INProgressMaxValue),
new object[] { SEARCHCOUNT });
this.Dispatcher.Invoke(new delegateProgress(INProgressMinValue), new object[] { 0 });
List<int> sosuList = new List<int>();
sosuList.Add(2);
// 검사대상수 1과 2는 건너뜀...
int number = 3;
// 소수 3만개 찾기위한 루프
while (sosuList.Count <= SEARCHCOUNT)
{
// 소수 검사 결과 일단은 소수라고 의심
bool result = true;
// 소수 검사
double stopNumber = Math.Sqrt(number);
foreach (int i in sosuList)
{
if ((number % i) == 0)
{
result = false;
break;
}
if (i > stopNumber) break;
}
// 진짜 소수면 리스트에 저장
if (result)
{
this.Dispatcher.Invoke(new delegateProgress(INProgressValue),
new object[] { sosuList.Count });
sosuList.Add(number);
}
// 검사대상 수 증가
number++;
// 검사수에 제한을 둠
if (number > 20000000) break;
}
// this.Dispatcher.Invoke(new delegateProgress(INProgressValue),new object[] { 0 });
// 추가적으로 파라미터 Thread !!를 구현하는 방법이다.
Thread th = new Thread(new ParameterizedThreadStart(Dispaly));
th.Start(sosuList);
}
void Dispaly(object prms)
{
IList<int> sosuList = prms as IList<int>;
int cnt = sosuList.Count;
foreach (int val in sosuList)
{
this.Dispatcher.Invoke(new delegateSetTextRender(SetTextRender),
new object[] { val, --cnt });
// this.textBox1.AppendText(val.ToString() + "\r\n");
}
}
}
'# 3) .Net ( Vs 2008 ) > WPF' 카테고리의 다른 글
FlexGrid : WPF 콤보 컬럼 (Combo Column Type) (0) | 2010.09.07 |
---|---|
IValueConverter 사용 데모 (0) | 2010.09.06 |
[WPF] Tab 순환코드 (0) | 2010.07.27 |
툴을 제작 해서 프로젝트를... 진행하다! (0) | 2010.02.26 |
WPF 3D (0) | 2009.12.29 |