2013-10-10 3 views
0

이 작동하지 않는 코드와 유사한 스레딩을 통해 컨트롤을 만들 수 있습니까?스레딩을 통한 컨트롤 생성

Thread t1 = new Thread(() => Panel p = create_control(param1,param2); 
t1.start(); 
this.Controls.Add(p); 

create_control 클래스는 유사하게 나타납니다

첫째로 당신은 매개 변수를 사용하여 컨트롤을 만들 수있는 클래스가, 나는 이것이 당신이 요구하는 어떤 생각

Panel p = new Panel(); 
p.Location... 
p.Size... 
p.Name... 
return p; 
+1

wpf use dispatcher – wudzik

+2

질문해야 할 질문은 "내가 왜 이러는거야?"입니다. –

+0

네, 가능하지만 왜 그걸하고 싶습니까? WinForms에서 한 스레드에서 컨트롤을 만들면 다른 스레드에서 생성 된 컨트롤에 추가 할 수 없습니다. (간단히 쓸모가 없습니다) –

답변

0

public class CreateControl 
{ 

    public Control Create(string name, Point location, Size size) 
    { 
     Panel p = new Panel(); 
     p.Name = name; 
     p.Location = location; 
     p.Size = size; 
     p.BackColor = Color.Red; 

     return p; 
    } 
} 

그리고 나서 winform에서 스레드를 사용하여 컨트롤을 만들 수 있습니다. d Tinwor가 제안한대로 폼의 invoke 메서드를 사용하여 폼에 컨트롤을 추가 할 때 크로스 스레딩 작업 예외가 발생하지 않도록합니다.

public partial class Form1 : Form 
{ 
    public delegate void AddToControl(Control control); 
    public AddToControl MyAddToControl; 

    public Form1() 
    { 
     InitializeComponent(); 

    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     Thread t1 = new Thread((ThreadStart)delegate 
               { 
                CreateControl c = new CreateControl(); 
                Panel p = (Panel)c.Create("panel_1", new Point(10, 10), new Size(100, 100)); 
                AddControlToControls(this, p); 
               }); 
     t1.Start(); 
    } 

    public void AddControlToControls(Control parent, Control control) 
    { 
     MyAddToControl = new AddToControl(this.AddControl); 
     parent.Invoke(this.MyAddToControl, control); 
    } 

    public void AddControl(Control control) 
    { 
     this.Controls.Add(control); 
    } 
} 

본질적으로 그렇습니다. 코드를 좀 더 간결하게 만들 수 있다고 확신합니다. 희망이 도움이됩니다.

+0

감사합니다. user1584413. Unfornutely, 그것은 내 문제를 해결하지 못했지만, 단지 내가 게시 한 것보다 훨씬 더 복잡한 코드이기 때문입니다. 이상한 것은 로딩 시간이 원래 시간보다 길다는 것입니다. 어쨌든, 당신의 대답은 비슷한 주제를 찾는 다른 사람을 도울 것입니다. – user2039470

+1

솔직히 말해서 나는 처음에 왜 이것을 원할 것인가에 대해 다른 사람들과 동의한다. 어떤 상황에서는 속도를 높이는 반면에 쓰레드는 쓰레드와 스토리지를 생성해야하므로 비용이 많이 든다. 나는 그것이 당신을 늦출지도 모른다는 것에 놀라지 않습니다. 그러나 내가 이것을해야만하는지 묻지 않은 다른 사람들의 의견에 동의하는 동안 나는 그것을 할 수 있는지 물었다. 단일 폼에 너무 많은 컨트롤이있는 경우 컨트롤을 사용자 정의 컨트롤로 분리하려고하면 폼을로드하는 것이 아니라 컨트롤을 더 쉽게 관리하고 필요할 때만로드하면됩니다. –

관련 문제