PDA

View Full Version : خطای ران تایم cross-thread و رفع این خطا



hosseinam1370
چهارشنبه 24 تیر 1394, 11:21 صبح
دوستان من نمیدونم معنی این خطا چیه ، و چجوری باید رفعش کنم ، و یا با دیدنش باید چیکار کنم!!!
اگه میشه یه توضیح بفرمایید که معنی این خطا چیه ، و من برای رفع کردن این خطا چیو باید یاد بگیرم تا بفهمم مشکل از کجاست و روش حلش چیه!!

خطا در عکس زیر نمایش داده شده.

با تشکر.

133275

TeacherMath
چهارشنبه 24 تیر 1394, 11:36 صبح
delegate void SetTextCallback(string text);


private void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}

hosseinam1370
چهارشنبه 24 تیر 1394, 13:00 عصر
چی شد الان؟ مشکل چی بود؟

TeacherMath
چهارشنبه 24 تیر 1394, 13:05 عصر
کنترل های روی فرم درون Thread اصلی قرار دارند و شما احتمالا از backgroundworker استفاده کردین که Thread جدیدی ایجاد می کند و نمی توان درون Thread جدید کنترل ها را تغییر داد و باید از delegate به روشی که نشان دادم استفاده کنید.

hosseinam1370
چهارشنبه 24 تیر 1394, 13:33 عصر
دارم با پورت سریال کار میکنم. اون خطی که کامنت داره رو نمیفهمم که چیکار میکنه.
private void DisplayText(object sender, EventArgs e)
{
textBox1.AppendText(dataRecieve);
}

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

dataRecieve = serialPort1.ReadExisting();

this.Invoke(new EventHandler(DisplayText));//inja ro nemifahmam che etefaqi dare miofte
}



اگه یه زحمت بکشید و بگید چی شده اینجا؟!!

با تشکر.

TeacherMath
چهارشنبه 24 تیر 1394, 13:43 عصر
تابع DisplayText در ترد اصلی است شما این تابع رو به صورت زیر تغییر بدین.

delegate void SetTextCallback();


private void SetText()
{


if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d);
}
else
{
this.textBox1.AppendText(dataRecieve)
}
}