اشکال در استفاده از Thread ها
سلام دوستان
من در مورد thread ها توی سایت جستجو کردم و دوستان هم اکثرا توضیحات جالبی داده بودند و مثالهای گوناگونی زده بودند ولی فقط یک اشکال کوچیک وجود داره که تو هیچ کدوم از اینها کد رو شرح نداده بودند. من تا حالا با نخ ها کار نکردم و طریقه استفاده کردن از اون رو هم بلد نیستم و هر چی هم به کد بچه ها نگاه کردم چیزی سر در نیاوردم.
مثلا بچه ها گفته بودند که برای بخشی که می خواین روش tread انجام بدین داخل یک پروسیجر بدون ورودی قرار بدین. حالا این تکه کد من که می خوام توش از tread استفاده کنم یک برنامه طولانیه و نیاز هست که همش رو داخل treadبندازم.
بعد از اون نحوه استارت و فراخوانی شو کجا قرار می دیم؟ داخل همون کد ها یا خارج از اون؟
من اینها رو متوجه نشدم.
علاوه بر اون چیز هایی در مورد tread و BackgroundWorker و delegate چیزهایی گفته شده بود که تقریبا شبیه هم بودند. اگه میشه فرق اینها رو هم با هم بگین.
راستشو بخواین من توی یک پروژه ای یک حلقه for دارم و این حلقه کارش طولانیه و حدود 2-3 ساعت می خواد کار انجام بده. خوب در حالت عادی برنامه هنگ می کنه تا کارش تموم بشه و هر مرحله از for حدود 5-6 ثانیه زمان می بره. من می خوام از tread ها برای کنترل این برنامه استفاده کنم یعنی برنامه هنگ نکنه و طول اجرای برنامه یک پروگرس بار نشون داده بشه و اگه کاربر خواست اونو pause کنه و بعدا ادامه بده و اگر هم خواست کل پردازش رو از کار بندازه
اگه میشه راهنمایی کنید
1 ضمیمه
نقل قول: اشکال در استفاده از Thread ها
به احتمال زیاد این مقاله میتونه کارتو راه بندازه!
توش تقریبا تمام جزئیات چند نخی کردن برنامه توضیح داده شده.
نقل قول: اشکال در استفاده از Thread ها
ممنون از پاسخ مفیدتون.
دانلود کردم برم بخونم اگه حل نشد باز مزاحمتون می شم
نقل قول: اشکال در استفاده از Thread ها
من توی پروژم گزارشات کارهایی که انجام می دم رو داخل یک لیست باکس نشون می دم. اما وقتی که از نخ استفاده کردم هنگام اجرای تکه کد پیغام می ده که به شیء لیست باکس دسترسی نداره.
این مشکل رو چطوری می تونم حل کنم؟
نقل قول: اشکال در استفاده از Thread ها
شما نمیتونی از 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";
}
نقل قول: اشکال در استفاده از Thread ها
:تشویق: با سلام
من فایل Threadin_inCSharp.rar رو سرع نگاه کردم ولی به نظر کامل میاد،
تشکر
نقل قول: اشکال در استفاده از Thread ها
salam
dar morede sakhtare tread ha tu c mikhastam bedunam.
mer30