PDA

View Full Version : جلوگیری از هنگ کردن برنامه با استفاده از ترد ها



IMANAZADI
شنبه 23 بهمن 1389, 15:12 عصر
با سلام خدمت دوستان عزیز
چند سوال در مورد ترد ها داشتم
توی سرچ مطالب زیاده راجه به ترد ها ولی نتونستم متوجه بشم و استفاده کنم مجبور شدم این تاپیک را بزنم
من یک برنامه نوشتم که فرم آن به صورت زیر است
روی فرم یک buttom یک تکس باکس که multiline آن True می باشد
با فشردن buttom یک فایل تکست به صورت کاراکتر به کاراکتر در یک textbox نشون داده میشه
ولی وقتی داره اینکار رو میکنه تا زمانی که تمام نوشته ها کامل درون textbox جای نگیره نمیشه از قسمت های دیگه استفاده کرد (فرم هنگ میشه)
حالا چطوری میشه با استفاده از تردها اینکار رو کرد بدون اینکه فرم هنگ کنه و بشه از قسمت های دیگه استفاده کرد .
کد برنامه رو براتون میزارم
ممنون میشم راهنمایی کنید .
سوال دیگه اینکه حالا اگر بخواهیم کدی را که در buttom نوشتیم را به صورت متد بنویسیم چطوری باید از ترد ها استفاده کنیم ؟
چون به صورت متدم که می نویسم خطای cross-thread exception میده


private void button1_Click (object sender , EventArgs e)
{


StreamReader stre = null;
int num;


try
{
.
stre = File.OpenText (@"C:\Users\Iman\Desktop\1.txt");


textBox1.Clear ();


num = stre.Read ();


while (num != -1)
{

textBox1.Text += Convert.ToChar (num);


num = stre.Read ();


textBox1.Refresh ();


Thread.Sleep (100);
}
}
catch (Exception ex)
{

MessageBox.Show (ex.Message);
}

}



بازم ممنون

IMANAZADI
شنبه 23 بهمن 1389, 19:58 عصر
لطفا جواب بدید ؟؟

IMANAZADI
شنبه 23 بهمن 1389, 21:09 عصر
چقدر جواب ؟؟
توی هر انجمنی تاپیک میزنم اینقدر جواب میگیرم که نگو
یا سوال های ما خیلی تخصصیه یا خیلی دوستان لطف دارند ؟؟

1 (http://barnamenevis.org/showthread.php?271794-%D9%86%D8%AD%D9%88%D9%87-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-Report-Application-%D9%BE%DB%8C%D8%B4-%D9%81%D8%B1%D8%B6-%D8%AE%D9%88%D8%AF-visual-studio2010-%D8%9F%D8%9F%D8%9F)

2

hossin.esm
یک شنبه 24 بهمن 1389, 08:55 صبح
دوست عزیز توی کدی که گذاشتید اصلا از نخ استفاده نشده.

shuriken
یک شنبه 24 بهمن 1389, 11:33 صبح
سلام
اول از همه دوست عزيز شما چقدر کم تحملي
بدشم شما ميتوني از اين روش استفاده کني که ساده ترين روشه.
شما اول يک تايمر رو توي برنامه استفاده ميکني بعد توي رخداد tick از شي Timer که به برنامه اضافه کردي
کد هاتو مينويسي البته بايد يه تغييراتي توش بدي تقريبا شبيه اين ميشه


StreamReader stre = null;
int num;
void TimerEventProcessor(Object myObject,EventArgs myEventArgs) {

{
if(num == -1)
{
timer.stop();
}
textBox1.Text += Convert.ToChar (num);


num = stre.Read ();


textBox1.Refresh ();
}
private void button1_Click (object sender , EventArgs e)
{




try
{
.
stre = File.OpenText (@"C:\Users\Iman\Desktop\1.txt");


textBox1.Clear ();


num = stre.Read ();

timer.start();

}
catch (Exception ex)
{

MessageBox.Show (ex.Message);
}

}

Reza,M
یک شنبه 24 بهمن 1389, 11:55 صبح
دوست عزيز ميشه به vb.net هم بنويسيش

IMANAZADI
یک شنبه 24 بهمن 1389, 12:36 عصر
دوست عزیز من نگفتم که تو برنامم نخ هست
گفتم چطوری میشه با استفاده از نخ ایکار رو کرد .
در جواب دوست عزیز shuriken باید عرض کنم میدونم بوسیله تایمر هم میشه انکار رو هم کردم ولی میخوام طرز استفاده از نخ را یاد بگیرم کلا شما صورت مسئله رو حذف کردید .
کسی از دوستان نیست این برنامه رو بصورت نخ دارم میگم بوسیله نخ الان یکی دیگه نیادبگه با background worker میشه حلش کرد. فقط با نخ حل کنه ؟

shuriken
یک شنبه 24 بهمن 1389, 14:02 عصر
البته شما یمقدار بهتر صحبت کنید فک کنم بیشتر جواب میگیرین
ولی لازم بذکر که خود تایمر یک thread هست.
شما اگه میخواستین طرز کار با thread هارو یاد بگیرین بهتر بود عنوان سوال رو چیز دیگه ای میذاشتین.
بهرحال شما برای انجام اینکار باید یه System.Threading.Thread بسازین و در رخداد دکمتون اون رو استارت کنین
و هرجا که میخواین با کنترلهای فرم کار کنین برای اینکه با thread اصلی برنامه دچار تداخل نشه باید از تابع this.Invoke استفاده کنین
این تابع عضوی از فرمتون هست که بعنوان آرگومان یک delegate میگیره که شما باید کارهای مربوط به تکست باکستون رو توی تابع مربوط
به اون delegate بنویسین.
دوست عزیز Reza,M متاسفانه من vb خوب بلد نیستم.

hossin.esm
یک شنبه 24 بهمن 1389, 14:49 عصر
یک مثال قبلا در رابطه با نخ ایجاد کرده بودم
http://barnamenevis.org/showthread.php?272843-تداخل-Thread-ها

IMANAZADI
یک شنبه 24 بهمن 1389, 15:19 عصر
دوست عزیز مگه من حرف بدی زدم یا بد صحبت کردم
به هر حال اگر توهینی شد یا سوء تفاهمی پیش آمد شما به بزرگواری خودتون ببخشید
شاید عنوان سوال بنده گمراه کننده بوده حق با شماست
دوست عزیز من using .system.thread را اضافه کردم
ولی وقتی می نویسم
threa th=new thread (new thread.start(method));
th.start();
از textbox خطای cross thread میگیره
مشکل اصلی من تو invoke کردن هست اصلا نمیدونم این invoke کارش چیه ؟
دوست گرامی اگه لطف کنید کدهایی که براتون گذاشتم به صورت هایی که توضیح دادید برام بنویسید چون چیزی متوجه نشدم .
ممنون

hossin.esm
یک شنبه 24 بهمن 1389, 19:02 عصر
کد شما با نخ

IMANAZADI
یک شنبه 24 بهمن 1389, 19:52 عصر
یا تشکر فراوان از دوست عزیز
دوستان دیگه میتونن با این مثال خیلی از مشکلاشون رو توی INVOKE کردن و THREAD جل کنند