PDA

View Full Version : سوال: Cross Thread Operation not valid



mmolia
یک شنبه 14 دی 1393, 23:42 عصر
این کد چرا اجرا نمی شه٬ من Thread دیگه ایجاد نکردم ولی میگه cross Thread Operation no valid?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;


namespace Test_threading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


public void compt()
{
while (true)
{
listBox1.Items.Add(listBox1.Items.Count);
}
}


private void button1_Click(object sender, EventArgs e)
{
ThreadStart Ts = new ThreadStart(compt);
Thread Tr = new Thread(Ts);
Tr.Start();


}
}
}

mmolia
دوشنبه 15 دی 1393, 00:11 صبح
جوابش رو فهمیدم:خجالت:

using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;


namespace Test_threading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}


public void compt()
{
try
{
while (true)
{
string x = listBox1.Items.Count.ToString();
listBox1.Items.Add(x);
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());


}
}


private void button1_Click(object sender, EventArgs e)
{
ThreadStart Ts = new ThreadStart(compt);
Thread Tr = new Thread(Ts);
Tr.Start();


}
}
}




مقدار CheckForIllegalCrossThreadCalls رو باید false کنید

SabaSabouhi
دوشنبه 15 دی 1393, 14:47 عصر
سلام
کار جالبی کردی، دوست من، این که نشد راه حل. اینطوری فقط مشکل رو دور زدی و کاری که باید هم انجام نمی‌شه.
شما یک Thread اصلی داری، یه Thread دیگه هم ایجاد کردی، این می‌شه دو تا.
حالا می‌خوای از Thread داخلی به یه کنترل که تو Thread اصلی هست دسترسی پیدا کنی.
این باعث بروز خطا می‌شه، برای این که برنامه‌ات کار کنه باید تو متد Compt یه تغییراتی بدی.
چون مدت زیادی هست که WinForm کار نکردم ممکنه دقیق نباشه، اما روش اینه:


delegate void VoidDelegate();

این خط رو بالای کلاست قرار می‌دی.
و تابع compt رو اینطوری نویسی:




private void Compt() {
if ( listBox1.InvokeRequired ) {
listBox1.Invoke( (VoidDelegate)Compt );
return;
}
// do your functions
}



صبا صبوحی

mmolia
دوشنبه 15 دی 1393, 23:17 عصر
سلام
کار جالبی کردی، دوست من، این که نشد راه حل. اینطوری فقط مشکل رو دور زدی و کاری که باید هم انجام نمی‌شه.
شما یک Thread اصلی داری، یه Thread دیگه هم ایجاد کردی، این می‌شه دو تا.
حالا می‌خوای از Thread داخلی به یه کنترل که تو Thread اصلی هست دسترسی پیدا کنی.
این باعث بروز خطا می‌شه، برای این که برنامه‌ات کار کنه باید تو متد Compt یه تغییراتی بدی.
چون مدت زیادی هست که WinForm کار نکردم ممکنه دقیق نباشه، اما روش اینه:


delegate void VoidDelegate();

این خط رو بالای کلاست قرار می‌دی.
و تابع compt رو اینطوری نویسی:




private void Compt() {
if ( listBox1.InvokeRequired ) {
listBox1.Invoke( (VoidDelegate)Compt );
return;
}
// do your functions
}



صبا صبوحی


مرسی جالب بود