2011-10-05 5 views
0

스레드 수를 사용하여 코어 수와 동일한 스레드를 생성하는 다중 스레드를 사용하여 일부 데이터를 처리하려고합니다 (.NET 2.0에서 3.5로 제한되어 있으므로 TPL을 사용할 수 없음).스레드 풀에서 진행률 표시 줄 업데이트 C#

내 모든 스레드가 내 데이터의 다른 부분에서 작동하는 동일한 기능을 실행합니다.

내 문제는 스레드 풀의 스레드에서 진행률 표시 줄을 업데이트 할 수 없습니다. 호출 및 백그라운드 작업자와 같은 솔루션을 찾았지만 사용 방법을 실제로 이해할 수 없어이를 사용하는 방법을 알려주십시오. 속도가 크로스 스레드 호출이 최소한의 시간을 차지하면 이렇게 아주 도움이 될 것입니다 나에게 가장 중요하다

private static float[] inpdat=new float[1000];//The input array to process 
//The spawned threads 
public void dowork(object o) 
{ 
    int np = (int)o; 
    for(int i=np;i<inpdat.length;i=i+Environment.ProcessorCount) 
    { 
     //do some processing 
     if(np==0) 
      { 
       //update progress bar here 
      } 
    } 
} 


    //The main thread 
    for (int npou = 0; npou < numproc; npou++) 
    { 
     resetEvents[npou] = new ManualResetEvent(false); 
     ThreadPool.QueueUserWorkItem(new WaitCallback(dowork), npou); 
     PetrelLogger.InfoOutputWindow("manual reset event set"); 
    } 

처럼

내 코드 보인다. 감사합니다.

+2

"스레드 수를 사용하여 코어 수와 동일한 스레드 생성"- 스레드 수를 명시 적으로 omptimise해야하는 경우는 거의 없습니다. 쓰레드 풀은 이것을 위해 설계되었습니다. –

답변

0

진행률 표시 줄에 사용자 컨트롤을 업데이트하는 방법이 있습니다. 양식을 구현하는 것으로, 입력 매개 변수로 양식을 추가하거나 결과에 대한 몇 가지 콜백 인터페이스를 추가 :

void Progress(int Progress) 
{ 
    if(this.InvokeRequired) 
    { 
     this.BeginInvoke(new ParametrizedThreadStart(Inv_Progress), Progress); 
    } 
    else 
    { 
     Inv_Progress(Progress); 
    } 
} 

void Inv_Progress(object obj) 
{ 
    int progress = obj as int; 
    // do your update progress bar work here 

} 

지금 당신이 다음을 수행 할 수 있습니다

형태로 구현에서
interface IMyCallback 
{ 
    void Progress(int progress); 
} 

하는 코드에 다음을 추가 :

: 여기
public void dowork(object o) 
{ 
    int np = (int)o; 
    for(int i=np;i<inpdat.length;i=i+Environment.ProcessorCount) 
    { 
     //do some processing 
     if(np==0) 
      { 
       myCallback.Progress(0); 
      } 
    } 
} 
1

은 일례이며
+0

나의 Algo와 Form은 다른 클래스에 있습니다. 캔트가 그 한계를 제거합니다. – user938972

+0

그래서 호출을 사용하지 마십시오. 해결 방법은 무엇입니까? – user938972

+0

ProgressBar 컨트롤에 직접 액세스 할 수 없다는 의미입니까? 다른 폼과 스레드 풀에서 다른 클래스를 호출하기 때문에 ProgressBar 컨트롤에 직접 액세스 할 수 없습니까? – A9S6

0

표준 호출이 가장 쉽고 익명의 대리자를 사용하여보다 명확하게 만들 수 있습니다. 특정 상황에서 (예를 들어, 하나 개의 스레드 내에서이 대표의 사용을 루프) 것을

int n = 5; 
myProgressBar.Invoke(
    delegate 
    { 
     myProgressBar.Value = n; 
    } 
); 

당신은 대리자를 선언하고 매개 변수로에 값을 전달해야합니다 유의하십시오. 그렇지 않으면 현지인들과 이상한 행동을 할 수 있습니다. 이것은 익명 메소드와 Action 클래스의 사용에도 해당됩니다.