C# 쓰레드에서 UI 속성 변경하기...
아래의 코드는 C# 쓰레드 상에서 UI 콘트롤의 속성을 변경할 때 cross thread 오류를 방지하는 코드의 예이다.
private delegate void ChangeProgressValueDelegate(Int32 val);
private void ChangeProgressValue(Int32 val)
{
pbBurning.Value = val;
}
private void DoProgressThread(Object stateInfo)
{
Int32 i = 1;
while (true)
{
if (pbBurning.ProgressBar.InvokeRequired)
{
pbBurning.ProgressBar.Invoke(new ChangeProgressValueDelegate(ChangeProgressValue), i++);
}
else
{
pbBurning.Value = i++;
}
Application.DoEvents();
if (pbBurning.Value == pbBurning.Maximum)
{
i = 1;
}
if (m_makeZipDone)
{
if (pbBurning.ProgressBar.InvokeRequired)
{
pbBurning.ProgressBar.Invoke(new ChangeProgressValueDelegate(ChangeProgressValue), pbBurning.Maximum);
}
else
{
pbBurning.Value = pbBurning.Maximum;
}
Thread.Sleep(50);
if (pbBurning.ProgressBar.InvokeRequired)
{
pbBurning.ProgressBar.Invoke(new ChangeProgressValueDelegate(ChangeProgressValue), pbBurning.Minimum);
}
else
{
pbBurning.Value = pbBurning.Minimum;
}
break;
}
Thread.Sleep(50);
}
m_progressDone = true;
m_autoEvent.Set();
}
private delegate void ChangeProgressValueDelegate(Int32 val);
private void ChangeProgressValue(Int32 val)
{
pbBurning.Value = val;
}
private void DoProgressThread(Object stateInfo)
{
Int32 i = 1;
while (true)
{
if (pbBurning.ProgressBar.InvokeRequired)
{
pbBurning.ProgressBar.Invoke(new ChangeProgressValueDelegate(ChangeProgressValue), i++);
}
else
{
pbBurning.Value = i++;
}
Application.DoEvents();
if (pbBurning.Value == pbBurning.Maximum)
{
i = 1;
}
if (m_makeZipDone)
{
if (pbBurning.ProgressBar.InvokeRequired)
{
pbBurning.ProgressBar.Invoke(new ChangeProgressValueDelegate(ChangeProgressValue), pbBurning.Maximum);
}
else
{
pbBurning.Value = pbBurning.Maximum;
}
Thread.Sleep(50);
if (pbBurning.ProgressBar.InvokeRequired)
{
pbBurning.ProgressBar.Invoke(new ChangeProgressValueDelegate(ChangeProgressValue), pbBurning.Minimum);
}
else
{
pbBurning.Value = pbBurning.Minimum;
}
break;
}
Thread.Sleep(50);
}
m_progressDone = true;
m_autoEvent.Set();
}
댓글