PDA

View Full Version : سوال: مشکل در هنکام استفاده از توابع کلاس Clipboard در Thread



محمد ذبیحی نژاد
یک شنبه 16 شهریور 1393, 22:58 عصر
با سلام خدمت بزرگواران
من در قطعه کد زیر که در یک نخ جدا از نخ اصلی برنامه نوشته شده به خطای زیر بر می خورم لطفا" با ذکر مثال توضیح دهید ممنون




namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
System.Timers.Timer t = new System.Timers.Timer(3000);
public Form1()
{
InitializeComponent();
}
[STAThread]
private void button1_Click(object sender, EventArgs e)
{
t.Elapsed += new ElapsedEventHandler(RunTimer);
t.Enabled = true;
t.Start();
}
[STAThread]
private void RunTimer(object source, ElapsedEventArgs e)
{
string text;
text = File.ReadAllText(Application.StartupPath + @"\file.txt");
Clipboard.SetText(text);
textBox1.Text = text;
t.Stop();
}
}
}


خطای زیر ظاهر می شه:


123177

NASA's Spaceman
یک شنبه 16 شهریور 1393, 23:09 عصر
توی رویداد فرم لودت این رو بنویس
private void Form1_Load(object sender, EventArgs e) {
CheckForIllegalCrossThreadCalls = false;
}
با سپاس Spaceman

Saman_12
یک شنبه 16 شهریور 1393, 23:43 عصر
توی رویداد فرم لودت این رو بنویس
private void Form1_Load(object sender, EventArgs e) {
CheckForIllegalCrossThreadCalls = false;
}
با سپاس Spaceman

نه واقعا !!!
اصلا متن خطا رو خوندی داداش فضایی؟(ناراحت نشی معنی اسمت میشه دیگه...)

و در ادامه پاسخ شما : باید قبل از صدا کردن start ترد موردنظر Apartment State اون رو ست کنید :

t.SetApartmentState(Threading.ApartmentState.STA)

asadimilad
دوشنبه 17 شهریور 1393, 00:33 صبح
string text;
t.Stop();
Invoke(new MethodInvoker(() =>
{
text = File.ReadAllText("c:\\20.txt");
Clipboard.SetText(text);
textBox1.Text = text;
}));

کدهات را تست کردم جواب گرفتم با رفع خطا

محمد ذبیحی نژاد
دوشنبه 17 شهریور 1393, 08:00 صبح
با تشکر از شما.
شما قبلا" هم همین راهنمایی را در یک پست دیگر برای من قرار داده بودید. ولی چون در آن پست، کامل به دستور کد نویسی و خطا نپرداخته بودم گفتم شاید شما تاییدتان بروی invoke باشد ولی با این پاسخی که دادید مطمئن شدم که راه حل شما نیز مفید فایده می باشد. از شما ممنونم
با ارزوی موفقیت:تشویق:

محمد ذبیحی نژاد
چهارشنبه 19 شهریور 1393, 17:03 عصر
نه واقعا !!!
اصلا متن خطا رو خوندی داداش فضایی؟(ناراحت نشی معنی اسمت میشه دیگه...)

و در ادامه پاسخ شما : باید قبل از صدا کردن start ترد موردنظر Apartment State اون رو ست کنید :

t.SetApartmentState(Threading.ApartmentState.STA)


آقا ممنون و متشکرم راه پیشنهادی جواب داد اما....
یک مورد خطای دیگه مثل خطای بالا که STAThradStatement بود در قسمتی دیگه از برنامه من رخ می دهد که رفتارش مثل نخ هاست ولی جزء System.Thread نیست.
اون قسمت از برنامه مربوط به System.Timer می شه که وقتی Timer زمان تنظیم شده اش فرا می رسه و می خواد تابع خودشو فراخوان کنه باز هم موقع رسیدن به توابع Clipboard همین خطای بالا را می دهد.
لطفا در این مورد هم راهنمایی فرمایید
با تشکر

محمد ذبیحی نژاد
چهارشنبه 19 شهریور 1393, 17:05 عصر
string text;
t.Stop();
Invoke(new MethodInvoker(() =>
{
text = File.ReadAllText("c:\\20.txt");
Clipboard.SetText(text);
textBox1.Text = text;
}));

کدهات را تست کردم جواب گرفتم با رفع خطا


آقا ممنون و متشکرم راه پیشنهادی جواب داد اما....
یک مورد خطای دیگه مثل خطای بالا که STAThradStatement بود در قسمتی دیگه از برنامه من رخ می دهد که رفتارش مثل نخ هاست ولی جزء System.Thread نیست.
اون قسمت از برنامه مربوط به System.Timer می شه که وقتی Timer زمان تنظیم شده اش فرا می رسه و می خواد تابع خودشو فراخوان کنه باز هم موقع رسیدن به توابع Clipboard همین خطای بالا را می دهد.
لطفا در این مورد هم راهنمایی فرمایید
با تشکر

asadimilad
شنبه 22 شهریور 1393, 19:07 عصر
ببین دوست گرامی اگه این همه مشکل با تایمر داری هر جا که نیاز به تایمر داری از یک ترد بجای تایمر استفاده کن مشکلت حل می شه یا اگه می خوای کد همان قسمت را بزار تا بتونیم کمکت کنیم