주 스레드에는 Windows 양식이 있고 계산에는 다른 스레드가 있습니다. 내 양식의 상태 표시 줄을 다른 스레드에서 수행중인 작업에서 업데이트하고 싶습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?다른 스레드에서 진행률 막대 업데이트
지금까지 내가 시도한 모든 것이 단지 매우 천천히 실행됩니다. Visual Studio 2005를 사용하고 있습니다.
주 스레드에는 Windows 양식이 있고 계산에는 다른 스레드가 있습니다. 내 양식의 상태 표시 줄을 다른 스레드에서 수행중인 작업에서 업데이트하고 싶습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?다른 스레드에서 진행률 막대 업데이트
지금까지 내가 시도한 모든 것이 단지 매우 천천히 실행됩니다. Visual Studio 2005를 사용하고 있습니다.
메인 스레드에서만 사용자 인터페이스를 업데이트해야합니다. 그렇지 않으면 문제가 발생합니다. Invoke를 호출하여 스레드 컨텍스트를 전환 할 수 있습니다. 좋은 게시글이 here입니다.
메인 스레드로 메시지를 보내고 메시지를 확인해야하지만 진행률 표시 줄을 업데이트 할 수 있습니다. 폴링 기능과 동일한 기능을 수행 할 수도 있습니다.
Control.Invoke
과 같은 마샬링 기술을 사용하면 UI 요소를 안전하게 조작 할 수있는 UI 스레드에서 대리인을 실행할 수 있지만 그 방법은 그리 좋지 않습니다. 사실, 간단한 진도 정보를 업데이트하는 것이 전부라면 끔찍한 접근입니다.
는 지금까지이 작업을 수행하는 가장 좋은 방법은 다음과 같습니다
System.Windows.Forms.Timers
을 통해 당신을 위해 잘 작동하는 간격으로 폴링하도록하십시오.다음과 같이 표시됩니다.
public class Example : Form
{
private volatile int percentComplete = 0;
private void StartThreadButton_Click(object sender, EventArgs args)
{
StatusBarUpdateTimer.Enabled = true;
new Thread(
() =>
{
for (int i = 1; i <= 100; i++)
{
DoSomeWork();
percentComplete = i;
}
}).Start();
}
private void StatusBarUpdateTimer_Tick(object sender, EventArgs args)
{
yourStatusBarPanel.Text = percentComplete.ToString() + "%";
StatusBarUpdateTimer.Enabled = percentComplete < 100;
}
}
이 있기 때문에 잘 작동 :
Invoke
의 경우처럼 작업자 스레드가 UI 스레드의 응답을 기다릴 필요가 없습니다.Invoke
이 부과하는 UI와 작업자 스레드 간의 긴밀한 연결이 끊어집니다.BeginInvoke
의 경우와 같이 UI 메시지 큐를 포화시킬 가능성은 없습니다.Invoke
코드로 코드를 낭비하지 않아도됩니다.
천천히 무엇을해야합니까? 어떻게 스레드를 사용합니까? –