2014-11-24 4 views
0

나는이 일을하는 데 몇 가지 방법을 시도했지만 효과가있는 것을 찾지 못하는 것 같습니다. GUI가 있고 단추를 누르면 모든 처리가 스레드에서 수행됩니다. 예를 들어 다음 코드가있는 경우 :다른 스레드의 패널을 어떻게 채울 수 있습니까?

public void coolMethod() 
    { 
     int a = 0; 
     while (a != 20) 
     { 
      addPicturebox(); 
      a++; 
      Thread.Sleep(1000); 
     } 
    } 

    int width = 3; 
    int height = 3; 
    int imgCounter = 0; 

    public void addPicturebox() 
    { 
     PictureBox pb = new PictureBox(); 
     pb.Size = new Size(50, 50); 
     pb.Location = new Point(width, height); 
     pb.ImageLocation = @"C:\Users\User1\Pictures\white.png"; 
     pb.Show(); 

     panel1.Controls.Add(pb); 
     imgCounter++; 

     width += 53; 

     if (imgCounter == 5) 
     { 
      height += 53; 
      width = 3; 
      imgCounter = 0; 
     } 
    }` 

그것은 그러나 coolMethod()가 다른 스레드에서 실행되고 작동합니다 내가/업데이트 다른 스레드에서 패널에 컨트롤을 추가 할 수 없습니다.

누구나 cool1을 실행할 수있는 솔루션이 있습니까? addPicturebox()이 메서드는 gui 스레드에서 실행되며 메서드가 완료되거나 다른 제안이있을 때까지 thread1이 일시 중지됩니다.

가능한 경우 많은 감사드립니다. 이 답변을 받았다면 많은 도움을 받았지만이 시나리오에서 작동 할 수있는 예제를 찾을 수 없기 때문에 친절하게도 저 페이지를 링크 할 수 있습니까?

답변

1

그것을하는 가장 쉬운 방법은 사용자가 원하는 것 또한 작동

panel1.Invoke((MethodInvoker)(() => 
{ 
    addPicturebox(); 
})); 

addPicturebox(); 

교체, 람다 호출 표현식입니다. 컨트롤이 추가 될 때까지 새 스레드가 일시 중지됩니다.

+0

와우

를 사용해야하고 나는 이것을 시도하고 완벽하게 일했다. 감사합니다 한 잔 Valjura – Faker

+0

@ Faker 당신의 기대에 부응한다면 대답을 수락하십시오. – Grx70

0
panel1.Invoke((Action)delegate { addPicturebox(); }); 
관련 문제