PDA

View Full Version : اشکال در استفاده از Thread ها



mahmood3d
دوشنبه 19 مرداد 1388, 11:58 صبح
سلام دوستان
من در مورد thread ها توی سایت جستجو کردم و دوستان هم اکثرا توضیحات جالبی داده بودند و مثالهای گوناگونی زده بودند ولی فقط یک اشکال کوچیک وجود داره که تو هیچ کدوم از اینها کد رو شرح نداده بودند. من تا حالا با نخ ها کار نکردم و طریقه استفاده کردن از اون رو هم بلد نیستم و هر چی هم به کد بچه ها نگاه کردم چیزی سر در نیاوردم.
مثلا بچه ها گفته بودند که برای بخشی که می خواین روش tread انجام بدین داخل یک پروسیجر بدون ورودی قرار بدین. حالا این تکه کد من که می خوام توش از tread استفاده کنم یک برنامه طولانیه و نیاز هست که همش رو داخل treadبندازم.
بعد از اون نحوه استارت و فراخوانی شو کجا قرار می دیم؟ داخل همون کد ها یا خارج از اون؟
من اینها رو متوجه نشدم.
علاوه بر اون چیز هایی در مورد tread و BackgroundWorker و delegate چیزهایی گفته شده بود که تقریبا شبیه هم بودند. اگه میشه فرق اینها رو هم با هم بگین.


راستشو بخواین من توی یک پروژه ای یک حلقه for دارم و این حلقه کارش طولانیه و حدود 2-3 ساعت می خواد کار انجام بده. خوب در حالت عادی برنامه هنگ می کنه تا کارش تموم بشه و هر مرحله از for حدود 5-6 ثانیه زمان می بره. من می خوام از tread ها برای کنترل این برنامه استفاده کنم یعنی برنامه هنگ نکنه و طول اجرای برنامه یک پروگرس بار نشون داده بشه و اگه کاربر خواست اونو pause کنه و بعدا ادامه بده و اگر هم خواست کل پردازش رو از کار بندازه
اگه میشه راهنمایی کنید

Reza_Yarahmadi
دوشنبه 19 مرداد 1388, 14:46 عصر
به احتمال زیاد این مقاله میتونه کارتو راه بندازه!
توش تقریبا تمام جزئیات چند نخی کردن برنامه توضیح داده شده.

mahmood3d
دوشنبه 19 مرداد 1388, 17:53 عصر
ممنون از پاسخ مفیدتون.
دانلود کردم برم بخونم اگه حل نشد باز مزاحمتون می شم

mahmood3d
چهارشنبه 21 مرداد 1388, 18:43 عصر
من توی پروژم گزارشات کارهایی که انجام می دم رو داخل یک لیست باکس نشون می دم. اما وقتی که از نخ استفاده کردم هنگام اجرای تکه کد پیغام می ده که به شیء لیست باکس دسترسی نداره.
این مشکل رو چطوری می تونم حل کنم؟

Sociant
چهارشنبه 21 مرداد 1388, 19:33 عصر
شما نمیتونی از Threadی غیر از Thread سازنده فرم به کنترلهاش دسترسی داشته باشی
پس راه حل اینه که از همون threadسازنده فرم استفاده کنی
کلاس فرم (و البته همه کنترل ها) متدی داره با اسم Invoke و خاصیتی به اسم InvokeRequired از نوع boolean
متد Invoke ، متدی را که تحت پوشش delegate بعنوان پارامتر میپذیره ، در Thread سازنده ی خودش اجرا میکنه
خصوصیت InvokeRequired مشخص میکنه که آیا شما در Thread سازنده فرم قرار دارین یا خیر
پس:
ابتدا با استفاده ازInvokeRequired بررسی میکنیم که در Thread فرم قرار داریم یا نه . اگه قرار داشتیم که بدون هیچ کار اضافی ، کنترل مورد نظرمون رو دستکاری میکنیم ، در غیر این صورت متدی که میخواهیم در اون کنترل رو دستکاری کنیم تحت پوشش delegate به متد Invoke ارسال میکنیم تا اجرا بشهو کنترل رو دستکاری کنه.



delegate void SampleDelegate();

void SampleMethod()
{
if(form.InvokeRequired)
{
SampleDelegate d = new SampleDelegate(SampleMethod);
form.Invoke(d);
}
else
lable1.Text = "My text was changed";
}

ka_motlagh
چهارشنبه 04 شهریور 1388, 19:27 عصر
:تشویق: با سلام
من فایل Threadin_inCSharp.rar رو سرع نگاه کردم ولی به نظر کامل میاد،

تشکر

shazlin
جمعه 20 آذر 1388, 15:40 عصر
salam

dar morede sakhtare tread ha tu c mikhastam bedunam.
mer30