PDA

View Full Version : ترد برای ایجاد اشیا در فرم



pouria_bayat
چهارشنبه 15 خرداد 1392, 13:11 عصر
با سلام خدمت همه عزیزان.
من میخواهم یک برنامه بنویسم که توی یک حلقه 10 تایی با استفاده از ترد و فرم لود 10 تا Panel به یک tabcontrol اضافه بشه اما برنامه ارور میده شکل کلی برنامه به صورت زیر هستش:


void SystemSearch()
{

for(int i=0;i<10;i++)
{


runadding();
}

}

void runadding()
{
Button cb = new Button();
cb.Text = "salam";
Panel newpanel = new Panel();
newpanel.Controls.Add(cb);
cb.Show();
newpanel.Parent = TabPageN;
TabPageN.SuspendLayout();
newpanel.Width = 50;
newpanel.Height = 50;
newpanel.BackColor = System.Drawing.Color.Blue;
TabPageN.Controls.Add(newpanel);
newpanel.Show();
TabPageN.ResumeLayout();
}


و در قسمت فرم لود:


this.Search = new Thread(SystemSearch);
this.Search.Start();


ممنون میشم راهنمایی کنید البته مشگل کار من زمانی هستش که runadding شروع به کار میکنه و ارور مربوطه اینطوری هستش:


System.InvalidOperationException: Cross-thread operation not valid:
Control 'TabPageN' accessed from a thread other the thread it was created on.

danialafshari
چهارشنبه 15 خرداد 1392, 13:50 عصر
سلام
آیا مانند این نیاز دارید؟

pouria_bayat
چهارشنبه 15 خرداد 1392, 16:30 عصر
سلام
آیا مانند این نیاز دارید؟
دقیقا میشه کدهارو هم قرار بدید.
ممنون.

danialafshari
چهارشنبه 15 خرداد 1392, 16:42 عصر
دقیقا میشه کدهارو هم قرار بدید.
ممنون.

سلام
ابتدا یک flowLayoutPanel از قسمت Toolbox روی فرم قرار دهید
من بخش تکرار رو تبدیل به کامپوننت کردم
شما هم می تونی panel و الحاقاتش رو تبدیل به کامپوننت کنی و با کد زیر کارت رو انجام بدی :
this.flowLayoutPanel1.Controls.Clear();
for (int i = 1; i <= 10; i++)
{
tSystem.tSystem1 ts = new tSystem.tSystem1(); // My Component
this.flowLayoutPanel1.Controls.Add(ts);
}

مثال Button :
this.flowLayoutPanel1.Controls.Clear();
for (int i = 1; i <= 10; i++)
{
Button but = new Button();
this.flowLayoutPanel1.Controls.Add(but);
}

موفق باشی

pouria_bayat
چهارشنبه 15 خرداد 1392, 19:16 عصر
ممنون میشه کدهای اضافه کردن به FlowlayoutPanel یعنی Component رو بزارید ممنون میشم منظورم این قسمت هستش:

tSystem.tSystem1 ts = new tSystem.tSystem1();

volcano_c
چهارشنبه 15 خرداد 1392, 21:16 عصر
دوست غزیز کامل مشخص خطا به حاطر چی هست

شما همزمان نمی تونی از یک آبجکت در چند thread استفاده کنی . اگر از یک object در چند thread استفاده کنی خطا می ده و می گه شما نمی تونید از یک object در چند thread استفاده کنی

اما می تونی به دات نت بگی که این قابلیت را از کار بندازه و چک نکنه

دستور زیر رو در فرم load قرار بده مشکل حل می شه

Control.CheckForIllegalCrossThreadCalls = false;