PDA

View Full Version : سوال: نخ و کنترلهاي فرم در دات نت ( #C )



ایمان اختیاری
چهارشنبه 12 فروردین 1388, 06:20 صبح
در دات نت کلاسي هست براي استفاده از نخ ها
خب . مسئله ي ما به اين صورت هست ..
فرمي داريم که دو دکمه و دو listbox داره ..
دو نخ تعريف شده که وظيفه ي اونا اينکه که هر کدوم در ليست باکس خودش شروع کنه از يک تا فرضا 1000 رو چاپ کنه .
با اين خصوصيت که هر نخ حدود يک ثانبه خواب داشته باشه و اطلاعات جوري نشون داده بشه که فرم فريز نشه و همچنين همه ي اعداد يکباره نشون داده نشن ( يعني در هر ثانيه يک عدد جديد به ليست باکس اضافه بشه )
مواردي که مهم هستن بگم خدمتتون :
1-چون از طراحي خود دات نت داريم استفاده مي کنيم پس توليد کدهاي ايجاد کنترل ها رو نمي خوايم ( توي MSDN چنين چيزي بود ولي اصلا جالب به نظر نمي رسيد )
2- چون کنترل ها رو خود دات نت مي سازه -> اين کنترل ها توسط نخ Main ايجاد و مديريت مي شن پس ما اينجا يه مشکل داريم که بخوايم از نخ هاي ديگه که خودمون داريم مي سازيم به اين کنترل ها به راحتي دسترسي داشته باشيم

اين مسئله توي سرورهاي Winsocket خيلي حياتي و به در بخورن ..
اگه کسي از دوستان با اين موارد برخورد داشته متشکر مي شم راهنمايي ام کنه

Ali_Mor
چهارشنبه 12 فروردین 1388, 09:33 صبح
- چون کنترل ها رو خود دات نت مي سازه -> اين کنترل ها توسط نخ Main ايجاد و مديريت مي شن پس ما اينجا يه مشکل داريم که بخوايم از نخ هاي ديگه که خودمون داريم مي سازيم به اين کنترل ها به راحتي دسترسي داشته باشيم
اینجا رو ببین:
http://www.barnamenevis.org/forum/showthread.php?t=149308

ایمان اختیاری
چهارشنبه 12 فروردین 1388, 17:35 عصر
بله ... البته این مثال رو دیده بودم ولی این مثال برای کنترل های ساده خوب جواب می ده نه مثلا DataGrid یا مثلا ListBox
البته یکی از دوستان گفته بود می شه نخ رو از نخ Main مشتق کنی ... مثه فرزند والدی .. در این مورد چیزی می دونید ؟

mostafaaa
پنج شنبه 13 فروردین 1388, 09:52 صبح
سلام دوست من
خوب مشکل کجاست شما، به راحتی میتونید این کار با استفاده از دو تا نخ و یه Event انجام بدین !!

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private delegate void MyEventHandler(ListBox sender,int i);
private MyEventHandler Handler;
private event MyEventHandler MyEvent;
private Thread T1;
private Thread T2;
private void Form1_Load(object sender, EventArgs e)
{
this.MyEvent += new MyEventHandler(Form1_MyEvent);
}
private void button1_Click(object sender, EventArgs e)
{
T1 = new Thread(Thread1);
T1.Start();
}
private void button2_Click(object sender, EventArgs e)
{
T2 = new Thread(Thread2);
T2.Start();
}
private void Thread1()
{
for (int i = 0; i <= 100; i++)
{
MyEvent(this.listBox1, i);
Thread.Sleep(1000);
}
}
private void Thread2()
{
for (int i = 0; i <= 100; i++)
{
MyEvent(this.listBox2, i);
Thread.Sleep(1000);
}
}
private void Form1_MyEvent(ListBox sender, int i)
{
if (sender.InvokeRequired)
{
Handler = new MyEventHandler(Form1_MyEvent);
object[] parametr = { sender, i };
sender.Invoke(Handler, parametr);
}
else
{
sender.Items.Add(i);
}
}

}
اینم پروژه مربوطه

Sajjad.Aghapour
پنج شنبه 13 فروردین 1388, 21:17 عصر
امیدوارم به جوابتون رسیده باشید.کلا عناصر UI در نخ ها باید با delegate انجام بشه و به روش thread safe.....
روش زیر یه خورده کوتاهتره


private delegate void myDel(int i);
private void Btn_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(tread_Safe));
t.Start();
}

private void tread_Safe()
{
for (int i = 0; i < 100; i++)
{
object[] obj = { i };
myDel del = new myDel(main_Method);
this.Invoke(del, obj);

Thread.Sleep(2000);
}
}

private void main_Method(int i)
{
listBox1.Items.Add(i);
}

tiia_kahkeshan
جمعه 21 فروردین 1388, 00:35 صبح
سلام ، من می خواستم کدهای ضمیمه و کدهای نوشته شده توسط شما را دنبال کنم تا روند کار دستم بیاد ولی بعد از سرهم بندی این پیغام را میده



Error 1 The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?) C:\Documents and Settings\yez\Desktop\WindowsApplication1\WindowsAp plication1\Program.cs 3 14 WindowsApplication1


why

احمد سامعی
جمعه 21 فروردین 1388, 00:45 صبح
این پیغام را میده


namespace name 'Linq' does not exist

why

شما از چه نسخه دات نت استفاده مي كنيد ؟
تا جايي كه من يادم اين كلاس در نسخه 3 به بعد هست و اگر از ويژوال استديو 2005 يا 2003 استفاده كنيد اين كلاس نداره
براي اطمينان به رفرنس هاي پرژوه مراجعه كنيد.

tiia_kahkeshan
جمعه 21 فروردین 1388, 06:14 صبح
من از visual studio 2005 استفاده می کنم ، جایگزینی برای اون کلاس وجود نداره یا می تونم این کلاس را به طور مثال از نسخه دات نت به کلاسهای ویژوال اضافه کنم یا ویژوال 2008 به کلاسهای ویژوال اضافه کنم
البته اگه میشه اونو دانلود کنم این گزینه را بگید بهتره.
ممنون

احمد سامعی
جمعه 21 فروردین 1388, 10:56 صبح
من می تونم این کلاس را به طور مثال از نسخه دات نت به کلاسهای ویژوال اضافه کنم ؟ممنون

سلام
دوست عزيز خود دردسر نده بهترين راه ارتقاء خودت، خرجش 3 يا 4 هزار تومان كه DVD 2008 بخري(خدا پدر مادر ما رو بيامرز كه تو اون ايران بدنيا آوردن :قهقهه: )
من هم همين اواخر گرفتم اما اشتباه كردم بايد همون اول كه 2008 اومده بود مي گرفتم
چون خيلي از راه كار ها مثال ها و كامپونت ها كه اين روزها از اينترنت مي گيري به 2008 و شما مثل همين مورد اين پست نمي توني ازش استفاده كني

پس به روز باش...:چشمک:

tiia_kahkeshan
جمعه 21 فروردین 1388, 22:58 عصر
سلام
دوست عزيز خود دردسر نده بهترين راه ارتقاء خودت، خرجش 3 يا 4 هزار تومان كه DVD 2008 بخري(خدا پدر مادر ما رو بيامرز كه تو اون ايران بدنيا آوردن :قهقهه: )
من هم همين اواخر گرفتم اما اشتباه كردم بايد همون اول كه 2008 اومده بود مي گرفتم
چون خيلي از راه كار ها مثال ها و كامپونت ها كه اين روزها از اينترنت مي گيري به 2008 و شما مثل همين مورد اين پست نمي توني ازش استفاده كني

پس به روز باش...:چشمک:
خوب شما حرف خوبی می زنید اما ما وقتی موفق میشیم که از کارای پشت پرده خبر داشته باشیم البته اینو به تدریج میشه یاد گرفت.

tiia_kahkeshan
دوشنبه 24 فروردین 1388, 05:47 صبح
سلام ، من می خواستم کدهای ضمیمه و کدهای نوشته شده توسط شما را دنبال کنم تا روند کار دستم بیاد ولی بعد از سرهم بندی این پیغام را میده



Error 1 The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?) C:\Documents and Settings\yez\Desktop\WindowsApplication1\WindowsAp plication1\Program.cs 3 14 WindowsApplication1


why
دوستان فرمودید توی visual studio 2005 ممکنه وجود نداشته باشه من نسخه 2008 را تهیه کردم اما باز همین پیغام را میده.why

tiia_kahkeshan
دوشنبه 24 فروردین 1388, 16:15 عصر
سلام
ممنون با کمک آقای احمدی حل شد. مربوط به همون reference می شد.

tiia_kahkeshan
دوشنبه 24 فروردین 1388, 19:12 عصر
در تاپیک 3 صفحه 1 این if چه موقع انجام میشود و سه دستور داخل آن چه کاری انجام می دهند ؟

http://www.sharemation.com/tiia/thread-barnamenevis.org.jpg

mostafaaa
دوشنبه 24 فروردین 1388, 22:16 عصر
سلام دوست من

در تاپیک 3 صفحه 1 این if چه موقع انجام میشود و سه دستور داخل آن چه کاری انجام می دهند ؟
به ازای هر بار اضافه شدن به Counter داخل حلقه ها یکبار این Event اجرا میشه. و در داخل شرط هم یه نمونه از Delegate که قبلا تعریف کردیم میسازیم و با استفاده از اون اجازه دسترسی به تردی که این Event رو اجرا کرده به لیست باکس که در ترد اصلی ایجاد شده میدیم.
امیدوارم مشکلتون حل شده باشه
یا علی

tiia_kahkeshan
شنبه 29 فروردین 1388, 18:32 عصر
سلام
من با الگو گرفتن از برنامه قبلی اینو نوشتم اما انجام نمیشه برنامه را دنبال کنید دوستان اگه بگن اشکالم کجاست ممنون میشم.من سعی کردم past کنم اما خراب past می کرد به خاطر همین فایل را دانلود کنید.



http://sites.google.com/site/sodayemarg/Home/uploud/WindowsFormsApplication1.zip?attredirects=0