PDA

View Full Version : خطای چند نخی



ahmad85_r
یک شنبه 13 دی 1388, 23:02 عصر
من به کمک ساکت و چند نخی برنامه ای نوشته ام که از جانب سرور متنی را دریافت می کند که در آن خطایی نیست اما به در موقعی که می خواهد متن را به تکس باکسی از فرم منتقل کند ارور زیر را می دهد:

Cross-thread operation not valid: Control 'textbox1' accessed from a thread other than the thread it was created on.

اینم کدی که به آن گیر می دهد:

while (true)
{
rc = clientSocket.Receive(recvBuffer);

if (rc > 0)
ERROR: textBox1.Text += System.Text.Encoding.ASCII.GetString(recvBuffer);

if (rc == 0)
{
clientSocket.Close();
break;
}
}


(فکر می کنم کد اصلی که یه برنامه چت به کمک ساکت بود رو هم از همین سایت گرفتم. کدها خیلی شبیه به هم اند اما در برنامه اصلی مشکلی وجود ندارد )

vcldeveloper
دوشنبه 14 دی 1388, 04:25 صبح
قبلا بارها در همین تالار توضیح داده شده که در هنگام نوشتن نرم افزارهای Multi-threaded، باید دقت کنید که هر کنترل بصری باید فقط توسط Threadایی که آن را ایجاد کرده تغییر داده بشه؛ یعنی وقتی یک کنترلی به صورت عادی توسط Thread اصلی برنامه ساخته میشه، سایر Threadهای برنامه نباید آن کنترل را (در مثال شما TextBox) تغییر بدند. اگر نیاز هست که محتوای آن TextBox تغییر کنه، Thread مربوطه باید Thread اصلی را مطلع کنه، تا Thread اصلی عمل تغییر را انجام بده.

برای اطلاعات بیشتر در همین تالار درباره این خطا و Threadها جستجو کنید.

Open-Source
دوشنبه 14 دی 1388, 10:24 صبح
راه حل مشکل شما استفاده از delegate و خاصیت InvokeRequired کنترلتون است.
برنامه زیر یک مقدار را به textbox اضافه میکند:




private delegate void setDisplayTextBox(string str);

private void fillTextBox(string tx)
{
if (textBox1.InvokeRequired == true)
{
setDisplayTextBox sd=new setDisplayTextBox(fillTextBox);
this.Invoke(sd,new Object[]{tx});
}
else
{
textBox1.Text += tx;
}
}
private void test()
{
fillTextBox("a");
}

private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(test));
th.Start();

}

nasime_shomal
شنبه 07 فروردین 1389, 16:52 عصر
راه حل مشکل شما استفاده از delegate و خاصیت InvokeRequired کنترلتون است.
برنامه زیر یک مقدار را به textbox اضافه میکند:




private delegate void setDisplayTextBox(string str);

private void fillTextBox(string tx)
{
if (textBox1.InvokeRequired == true)
{
setDisplayTextBox sd=new setDisplayTextBox(fillTextBox);
this.Invoke(sd,new Object[]{tx});
}
else
{
textBox1.Text += tx;
}
}
private void test()
{
fillTextBox("a");
}

private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(test));
th.Start();

}

سلام به همه دوستان کسی می تونه بگه که خاصیت InvokeRequired کنترل چکار میکنه؟:متفکر: