PDA

View Full Version : سوال: مشکل در ایجاد کنترل جدید وقتی از thread استفاده می کنم



mohan21
شنبه 24 دی 1390, 14:13 عصر
با سلام

برنامه رو دانلود و اجرا کنید با خطای::

Controls created on one thread cannot be parented to a control on a different thread.

برخورد می کنید، برای حل این مشکل په باید کرد؟

در ضمن خیلی گشتم اما چیزی دستگیرم نشد ...


با تشکز از شما دوستان

meysamrt
شنبه 24 دی 1390, 15:35 عصر
این کد رو به برنامه ات اضافه کن احتمالا درست بشه. البته این روش مناسبی نیست ولی ساده ترین کاره. اگه از Reflection استفاده کنی بهتره


public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}

mohan21
شنبه 24 دی 1390, 16:22 عصر
دوست گرام مشخص هست که برنامه رو مشاهده نکرده اید، چون این چیزی که فرموده اید در برنامه وجود داره .....

senaps
شنبه 24 دی 1390, 16:28 عصر
دوست عزیز،خطایی که به شما داده این هستش که شما نمیتونین از یه ترد بخواین کارهایی رو بکنه که تو یه ترد دیگه هست......
ترم قبل من برا برنامه ی چت بین دو سیستم این مشکل رو داشتم،با دلیگیت ها حل کردم مشکل رو....

mohan21
شنبه 24 دی 1390, 20:09 عصر
دست شما درد نکنه دوست گرام

من هم این رو متوجه شده ام

اما از چی و چطور راه حل رو باید پیدا کرد نمیدونم .....

linux
شنبه 24 دی 1390, 21:20 عصر
دست شما درد نکنه دوست گرام

من هم این رو متوجه شده ام

اما از چی و چطور راه حل رو باید پیدا کرد نمیدونم .....

msdn دنبال requeredinvoke بگردید

senaps
شنبه 24 دی 1390, 21:49 عصر
اما از چی و چطور راه حل رو باید پیدا کرد نمیدونم .....

گفتم که...مشکل من با دلیگیت ها حل شد....من اینجا مطرح کردم،یکی از دوستان برا من دلیگیتی نوشت و من تو پروژه گذاشتم و تمام....البته هنوز موندم که دلیگیت چیکار مکینه؟!(فک کنم یه جور اونت کاستومه!)باید از دوستان حرفه ای بپرسین....
راستی،اگر کد های برنامه رو میذاشتین تو بلاک سی شارپ بهتر بود و کاربر های بیشتری میخوندنش....اینجا کسی حوصله نداره که فایل ها رو دونه دانلود کنه و بخونه و بعد دیباگ کنه و بعدش بخواد اصلاح کنه و به شما بگه!

mohan21
یک شنبه 25 دی 1390, 15:14 عصر
دوستان از invoke هم استفاده کردم اما همچنان مشکل رفع نشده، دوستانی که به این مشکل برخورد کرده اند لطفاً کمک کنند،

برنامه شامل این چتد خط میشه ::

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

namespace Test
{
public partial class Main : Form
{
public Main()
{
InitializeComponent();

CheckForIllegalCrossThreadCalls = false;
}

Thread newThread;
int Flag;

private void btnStart_Click(object sender, EventArgs e)
{
if (Flag == 1)
newThread.Abort();

Flag = 1;

newThread = new Thread(new ThreadStart(Test));

newThread.Start();
}

private void Test()
{
txtShow.Text = "";

for (int i = 0; i < 6; i++)
{
txtShow.Text = i.ToString();
Refresh();
Thread.Sleep(1000);
}

///****************************
Panel pnlPage = new Panel();
pnlPage.Parent = this;
pnlPage.Size = new Size(144, 100);
pnlPage.BackColor = Color.Blue;
pnlPage.Location = new Point(12, 120);
///****************************

}

private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
if (Flag == 1)
newThread.Abort();
}
}
}

که خطای از pnlPage.Parent = this هست ....

spring69
یک شنبه 25 دی 1390, 16:37 عصر
سلام
کدتون رو بشکل زیر بنویسید:
public Form1()
{
InitializeComponent();

CheckForIllegalCrossThreadCalls = false;
}

Thread newThread;
int Flag;

private void btnStart_Click(object sender, EventArgs e)
{
if (Flag == 1)
newThread.Abort();

Flag = 1;

newThread = new Thread(new ThreadStart(Test));

newThread.Start();
}

private void Test()
{
textBox1.Text = "";

for (int i = 0; i < 6; i++)
{
textBox1.Text = i.ToString();
Refresh();
Thread.Sleep(1000);
}

var pnlPage = new Panel();
AccessForm(pnlPage);
pnlPage.Size = new Size(144, 100);
pnlPage.BackColor = Color.Blue;
pnlPage.Location = new Point(12, 120);

}


public void AccessForm(Panel pnlPage)
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(() => AccessForm(pnlPage)));
}
else
{
pnlPage.Parent = this;

}
}


private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
if (Flag == 1)
newThread.Abort();
}
}

amirzandi
چهارشنبه 10 اسفند 1390, 10:24 صبح
سلام ؛ این کدی که زدین توی vb کار نمی کنه!