PDA

View Full Version : سوال: الصاق نتیجه چند Thread در یک کلاس و بازگشت به برنامه



mahdi_farhani
شنبه 01 فروردین 1388, 11:05 صبح
با سلام و تبریک سال جدید و آرزوی موفقیت در تمام مراحل زندگی برای همه دوستان.
ماجرا از این قراره که من یک کلاس دارم برای یکسری عملیات یکی از متدها باید به صورت همزمان عملیاتی را انجام بده . که این عملیات باید به 4 قسمت تقسیم بشه و هر قسمت پردازش لازم را انجام بده و نتیجه برگرده و با هم ترکیب بشه و به کلاس اصلی برگرده .


public String MyWork(string Source)
{
.
.
.
.
thread_1.Start(part_1);
thread_2.Start(part_2);
thread_3.Start(part_3);
thread_4.Start(part_4);
return Part_1 + Part_2 + ........
}
private void DoWork(object source)
{
....
}

حالا مشکل اینجاست ، که اولاً چطوری میشه از تابع خروجی گرفت ( اگر هم نمیشه طوری نیست یک متغییر سراسری مشکلشو حل میکنه )
ولی مشکل اصلی ترکیب نتایج هست که معلوم نیست کدم ترد کارش زودتر تمام میشه
ترتیب قرار گرفتن نتایج خیلی مهم هست ، یعنی باید به ترتیب Part ها باشه

mahdi_farhani
شنبه 01 فروردین 1388, 11:49 صبح
مشکل بازگشت مقدار رو با BeginInvoke حل کردم . فقط مونده ترتیب و ترکیب

mahdi_farhani
شنبه 01 فروردین 1388, 13:20 عصر
مشکل را به روش سرخپوستی حل کردم . ولی دنبال روش اصولیش هستم

int p1 = 0;
int p2 = 1;
int p3 = 2;
int p4 = 3;
handler.BeginInvoke(part_1,ref p1, new AsyncCallback(asyncMethod_CallBack), null);
handler.BeginInvoke(part_3, ref p3, new AsyncCallback(asyncMethod_CallBack), null);
handler.BeginInvoke(part_2,ref p2, new AsyncCallback(asyncMethod_CallBack), null);
handler.BeginInvoke(part_4,ref p4, new AsyncCallback(asyncMethod_CallBack), null);

while (!finish[0] || !finish[1] || !finish[2] || !finish[3])
{

}
return output[0] + output[1] + output[2] + output[3];

Chabok
یک شنبه 02 فروردین 1388, 19:00 عصر
با سلام و تبریک سال نو

همین روشی که رفتین (سرخپوستی) زیاد بد نیست . درس سیستم عامل که میخوندیم موقعی که انحصار متقابل ها رو میگفتند چندین روش رو قبل سمافور ها میگفتند که همش به همین صورت بود .

یعنی تا موقعی که نوبت یکی دیگه بود این بابا همش توی یک حلقه بود تا اون یکی از حمام بیاد بیرون :لبخند:

روش جالبی پبدا کردم عرض میکنم. فقط خواستم بگم فکر نکنم این روش مشکلی ایجاد کنه .

mostafaaa
یک شنبه 02 فروردین 1388, 22:37 عصر
سلام دوست من
اول اینکه برای برگردوندن مقادیر توابع به نظر من بهتره که یه Event بنویسی و وقتی تابع تموم شد مقدار بازگشتیت رو با وسیله اون Event برگردونی .
در ثانی شما میتونی نتایجت رو بعد از پایان یافتن هر چهار Thread مرتب کنید و بعد اونها رو با هم ترکیب کنید .
فقط کافی در هر بار فراخوانی Event بالا شرط Live بودن سه Thread دیگه رو چک کنید و اگه هر سه False بود خوب معلومه که چیکار باید کرد.
در آخر اینکه اگه در پاسخ گفتن به سوالتون به اشتباه رفتم، دلیلش اینه که از جزئیات کارتون اطلاع ندارم و نمیدونم هدفتون چیه !
یا علی

mahdi_farhani
دوشنبه 03 فروردین 1388, 00:19 صبح
با تشکر از شما دوست عزیز
من دو تا Event دارم ، یکی برای اینکه در حال کار کردن ترد ها رو بررسی کنم ( مثلاً میزان پیشرفت کار ) و یک Event هم برای اتمام کار دارم که مقدار رو بر میگردونه .
تعداد ترد ها متغییر است . بستگی به کاربر داره از 4 ترد میتونه باشه تا به بالا ( بستگی به حجم پردازش داره )
این چیزهایی که شما گفتید سناریو خودم هست ، که با روش بالا تقریباً حل شد .
من دنبال راه اصولی تر هستم
کد هم که بالا نوشتم کد ساده شده ای هست که الان در حال استفاده هستم.مثلاً تو کد بالا Part ها استاتیک هست و دستی 4 تا تعریف شده . ولی تو برنامه اصلی به صورت یک لیست جنریک هست که به صورت پویا مقدار دهی میشه ................................................
هدف اصلی من پردازش یک فایل با حجم بالاست . که برای پردازش احتیاج به چندین ترد دارم
هر ترد باید کار خودشو جداگانه انجام بده ، و در آخر نتیجه برگرده
تو پردازش اصلیم یک حلقه و 4 تا شرط دارم . دیگه حوصله محاسبه پیچیدگی زمانی ندارم ، که بخواهم بگم پیچیدگی زمانی این پردازش چقدر میشه .:اشتباه::چشمک:
فقط این نکته را داشته باش ، که فایلی با حجم 3 مگا بایت رو برای پردازش به صورت معمولی نزدیک به 38 دقیقه طول میکشه تا پردازش تمام بشه(شاید الگوریتمی که نوشتم اشتباه باشه ، ولی بحث من سره الگوریتم نیست )
ولی با مولتی ترد من اینو به 3 دقیقه نزدیک کردم .:بوس: