2012-10-28 2 views
0

몇 가지 명령을 실행하는 장면이 있습니다. 내가 시뮬레이션을하고 모든 단계를 만들고 싶다고 가정 해 봅시다. 그렇게 할 수 있습니다.OpenTK로 비동기 이미지 그리기

private void button4_Click(object sender, EventArgs e) 
{ 
    commands[global++].Execute(ref area.heightMap, ref sim); 
    glControl1.Invalidate(); //openTK redrawing 
} 

버튼을 클릭하면 장면의 모든 단계가 표시됩니다. 하지만 이제는 그와 같이 할 수있는 연속 시뮬레이션을보고 싶습니다.

private void button1_Click_1(object sender, EventArgs e) 
{ 
    for (int i = 0; i < commands.Count; i++) 
    { 
     button4_Click(null, null); 
     Thread.Sleep(100); 
    } 
} 

하지만 결과는 모든 명령이 실행 된 다음 마지막으로 이미지가 표시됩니다. 그래서 문제는 모든 시뮬레이션 명령 (모든 실행 명령 이후)을 어떻게 표시해야 하는가입니다. 추가 질문 -이 Execute()가 많은 작은 단계로 이루어져 있다고 가정합니다. 이 작은 단계를 모두 표시하려면 어떻게합니까?

+0

나는 배경 작업자와 작업을했습니다. 어쨌든 대의원들과 함께 할 수 있습니까? – rank1

답변

0

다른 스레드에서 명령을 실행해야하며 (TPL을 사용할 수 있음) 작업 스레드에서 대기해야하지만 UI 스레드에서는 제어 권한을 무효화해야합니다.

foreach(var command in commands) 
{ 
    Task<int>.Factory.StartNew(ExecuteCommand) 
     .ContinueWith(
      t => Invalidate(t.Result), 
      CancellationToken.None, 
      TaskContinuationOptions.PreferFairness, 
      TaskScheduler.FromCurrentSynchronizationContext()); 
} 


private void Invalidate(int heightMap) 
{ 
    area.heightMap = eightMap; 
    glControl1.Invalidate(); 
} 

private int ExecuteCommand() 
{ 
    // returns new heightMap, because it's executes in non-UI thread 
    // you can't set UI control property 
    return Execute(area.heightMap, sim); 
} 
+0

BackgroundWorker로도 작업 할 수 있습니다. 그러나 이것은 Execute 명령의 signle 단계에서 많은 결과를 얻는 방법으로 문제를 해결하지 못합니다. 일부 대리인을 사용하여 문제를 해결할 수 있습니까? 나는 이미 그들을 사용하지 havent – rank1

+0

무효화 사용 area.heightMap과 시뮬레이션합니까? –

+0

area.heightMap과 sim의 의미를 설명 할 수 있습니까? –