PDA

View Full Version : سوال: مشکل در اجرای همزمان thread ها



محسن شامحمدی
چهارشنبه 22 دی 1389, 20:58 عصر
با سلام
یک picturebox دارم که می خوام با استفاده از دو ترد به صورت همزمان از دو طرف صفحه این عکس رو تکمیل کنم.
64953

برنامشو هم نوشتم ولی تنها مشکلم اینه که به جای اینکه این دو ترد همزمان اجرا بشن ،اول یکیش کارشو انجام می ده بعد می ره سراغ بعدی.
لطف می کنید اگه بگید باید چکار کنم تا همزمان اجرا بشن.؟
اگه می شه این پروژه رو ببیند تا متوجه منظورم بشین.

@Rejnev (http://barnamenevis.org/member.php?99991-Rejnev)جان اوامر اطاعت شد و فایل ضمیمه اصلاح شد
(http://barnamenevis.org/member.php?99991-Rejnev)

Rejnev
چهارشنبه 22 دی 1389, 21:21 عصر
بی ارتباط با موضوع:
قبل از اینکه جواب رو کسی بده یک خواهش داشتم.
بهتره در شرط حلقه از یک عبارت ثابت به جای یک عبارت محاسباتی استفاده کنید.


a=width/2;
for i=0 to a
next i

محسن شامحمدی
پنج شنبه 23 دی 1389, 09:33 صبح
دوستان شما که با ترد کار کردین.
حالا من می خوام این دوتا یک خط در میان روی یک شی کار کنن.
بازم ممنونم و همچنان منتظرم

hossein-khoshseyar
پنج شنبه 23 دی 1389, 14:53 عصر
با سلام
یک picturebox دارم که می خوام با استفاده از دو ترد به صورت همزمان از دو طرف صفحه این عکس رو تکمیل کنم.


برنامشو هم نوشتم ولی تنها مشکلم اینه که به جای اینکه این دو ترد همزمان اجرا بشن ،اول یکیش کارشو انجام می ده بعد می ره سراغ بعدی.
لطف می کنید اگه بگید باید چکار کنم تا همزمان اجرا بشن.؟
اگه می شه این پروژه رو ببیند تا متوجه منظورم بشین.

@Rejnev (http://barnamenevis.org/member.php?99991-Rejnev)جان اوامر اطاعت شد و فایل ضمیمه اصلاح شد
(http://barnamenevis.org/member.php?99991-Rejnev)
دوست عزیز من نگاهی به کدت انداختم و یه کم هم باهاش کار کردم
مطمئن نیستم اما احتمال زیاد میدم که چنین چیزی شدنی نباشه
فکر می کنم منطقی نباشه که به یک آبجکت در ان واحد دونفر بتونن توش بنویسن
خیلی سریع یه ستون از چپ و یه ستون از راست رو پر کرد اما اینکه این دو بخوان همزمان با هم کار کنن بعید می دونم
در هر صورت اگر کسی راه حلی داره ممنون میشیم که بزاره تا ما هم ببینیم

omid-vbAuto
پنج شنبه 23 دی 1389, 17:46 عصر
دوست عزیز من نگاهی به کدت انداختم و یه کم هم باهاش کار کردم
مطمئن نیستم اما احتمال زیاد میدم که چنین چیزی شدنی نباشه
فکر می کنم منطقی نباشه که به یک آبجکت در ان واحد دونفر بتونن توش بنویسن
خیلی سریع یه ستون از چپ و یه ستون از راست رو پر کرد اما اینکه این دو بخوان همزمان با هم کار کنن بعید می دونم
در هر صورت اگر کسی راه حلی داره ممنون میشیم که بزاره تا ما هم ببینیم

من یه راه حلی به نظرم می آد که اگه بخواهین برنامشو می ذارم.البته این راه حل صرفا جهت بر طرف کردن این مشکله و ربطی به ترد نداره.

Saman_12
پنج شنبه 23 دی 1389, 18:10 عصر
چرا شما هر دو کار رو توی یک ترد انجام نمیدید؟ :



Public Class Form1
Dim bmp As New Bitmap(Application.StartupPath & "\picture.jpg")
Dim b As New Bitmap(Application.StartupPath & "\blank.jpg")
Dim t1 As New Threading.Thread(AddressOf f1)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
PictureBox1.Image = b

t1.Start()

End Sub

Private Sub f1()

If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf f1))
Else
Dim c = PictureBox1.Width / 2
For x = 0 To c
Me.Refresh()

Dim a = PictureBox1.Height - 1
For y = 0 To a
b.SetPixel(x, y, bmp.GetPixel(x, y))
b.SetPixel(-x + (PictureBox1.Width - 1), -y + PictureBox1.Height - 1, bmp.GetPixel(-x + (PictureBox1.Width - 1), -y + PictureBox1.Height - 1))
Next
Next
Me.Refresh()
End If
End Sub

End Class

Rejnev
پنج شنبه 23 دی 1389, 20:49 عصر
اگه هدفه شما چيزي تو مايه هاي رندر 3d max ه كه فكر مي كنم، روش كار اونها يكم فرق كنه.
شما مي تونيد دو تصوير به اندازه نصف تصوير اصلي ايجاد كنيد و دو ترد هم ايجاد كنيد كه هر يك روي يك تصوير كار كنند.
بعد از اتمام كار ترد ها مي تونيد دو تصوير رو كنار هم بذاريد. توجه داريد كه نمايش پيشرفت كار تنها بخشي از الگوريتمه و نه همش...

محسن شامحمدی
جمعه 24 دی 1389, 12:51 عصر
دوست عزیز من نگاهی به کدت انداختم و یه کم هم باهاش کار کردم
مطمئن نیستم اما احتمال زیاد میدم که چنین چیزی شدنی نباشه
فکر می کنم منطقی نباشه که به یک آبجکت در ان واحد دونفر بتونن توش بنویسن
خیلی سریع یه ستون از چپ و یه ستون از راست رو پر کرد اما اینکه این دو بخوان همزمان با هم کار کنن بعید می دونم
در هر صورت اگر کسی راه حلی داره ممنون میشیم که بزاره تا ما هم ببینیم
فرمایش شما کاملا متینه و این درسته که 2 ترد همزمان نمی تونن به شی دسترسی داشته باشن ولی حتی من با mutex این شی رو قفل هم کردم ولی هیچ تاثیری نداشت.
mutex: شیئی است که اجازه نمی ده اون تکه کدی که قفل کردی در آن واحد بیشتر از یکبار اجرا بشه


من یه راه حلی به نظرم می آد که اگه بخواهین برنامشو می ذارم.البته این راه حل صرفا جهت بر طرف کردن این مشکله و ربطی به ترد نداره.
نه ممنون.بنده می خوام طرز کار ترد رو متوجه بشم نه این که یک افکت درست کنم.



چرا شما هر دو کار رو توی یک ترد انجام نمیدید؟ :

چون بنده می خوام ببینم این قضیه(که از لحاظ منطقی هم باید بشه)چرا نمی شه.


اگه هدفه شما چيزي تو مايه هاي رندر 3d max ه كه فكر مي كنم، روش كار اونها يكم فرق كنه.
شما مي تونيد دو تصوير به اندازه نصف تصوير اصلي ايجاد كنيد و دو ترد هم ايجاد كنيد كه هر يك روي يك تصوير كار كنند.
بعد از اتمام كار ترد ها مي تونيد دو تصوير رو كنار هم بذاريد. توجه داريد كه نمايش پيشرفت كار تنها بخشي از الگوريتمه و نه همش...
نه هدف بنده اینه که پرشدن پیکچرباکس با هردوتای این تصویرها بصورت همزمان به کاربر نمایش داده بشه و پردازش تصویر هدف بنده نیست.

محسن شامحمدی
جمعه 24 دی 1389, 13:02 عصر
دوستان فکر کنم داریم نزدیک می شیم.
این دفعه همه کدا رو ریختم توی یک تابع که با ورودی های مختلف کارهای مختلفی انجام میده.
حالا دوتا ترد هم ساختم که هر کدوم یک ورودی می دن ولی توی یک تابع.
اینطوری حدود 70 درصد مشکل حل شد.
فقط چیزی که می مونه اینه که بعد از این که کمی پیشرفت می کنه تردها با هم دیگه به یک شی دسترسی پیدا می کنن و exception می ده.
با اینکه از mutex هم استفاده کردم ولی بازم مشکل باقیست.(فکر کنم طریقه استفادماشتباهه)
ببینیدش:

hossein-khoshseyar
جمعه 24 دی 1389, 16:04 عصر
دوستان فکر کنم داریم نزدیک می شیم.
این دفعه همه کدا رو ریختم توی یک تابع که با ورودی های مختلف کارهای مختلفی انجام میده.
حالا دوتا ترد هم ساختم که هر کدوم یک ورودی می دن ولی توی یک تابع.
اینطوری حدود 70 درصد مشکل حل شد.
فقط چیزی که می مونه اینه که بعد از این که کمی پیشرفت می کنه تردها با هم دیگه به یک شی دسترسی پیدا می کنن و exception می ده.
با اینکه از mutex هم استفاده کردم ولی بازم مشکل باقیست.(فکر کنم طریقه استفادماشتباهه)
ببینیدش:

من فکر کنم (فقط فکر می کنم ) که این روش برنامه نویسی برای ترد مشکل داره
من یه پیشنهاد دارم
به نظر من این طرز برنامه نوسی برای ترد منطقی هست
شما باید یه متغیر از نوع بیت مپ تعریف کنی
بعد این دو تا ترد اون متغیر رو تغییر بده و پردازش کنه
بعد توی فرم اصلی مثلا یه تایمری باشه و اون بیت مپ رو لود کنه توی پیکچر باکس
من فکر می کنم این روش اصولیتر هست
سعی می کنم پیادش کنم
البته هنوز کد شما رو ندیدم
شاید با ور رفتن اون هم بشه کاری کرد

محسن شامحمدی
جمعه 22 بهمن 1389, 10:16 صبح
بالاخره درستش کردم



شما باید یه متغیر از نوع بیت مپ تعریف کنی
بعد این دو تا ترد اون متغیر رو تغییر بده و پردازش کنه
بعد توی فرم اصلی مثلا یه تایمری باشه و اون بیت مپ رو لود کنه توی پیکچر باکس
من فکر می کنم این روش اصولیتر هست
ممنون .فرمایشاتتون خیلی به دردم خورد.

سلام دوستان
من به این نتیجه رسیدم شما هیچکدومتون تا حالا به صورت جدی با ترد کار نکردید و در نتیجه هیچ برنامه چندنخی درست حسابی ننوشتید.
من تو این مدت داشتم روی ترد تحقیق می کردم و تابحال چیزهای جالبی هم یاد گرفتم.
این کاری که خودم می خواستم رو هم انجام دادم با استفاده از mutex .
شی ای است که تضمین می کند یک تکه کد بصورت همزمان فقط در یک ترد اجرا شود.
من از این شی استفاده کردم و شی تصویرمو قفل کردم و اینطوری مشکل دسترسی دو تا ترد با هم به یک شی رفع شد
در هر صورت من سورس این برنامه رو می ذارم تا شما هم ببینید و انشاالله استفاده کنید
و در آخر از مقاله Thread Synchronization (C# and Visual Basic) (http://msdn.microsoft.com/en-us/library/ms173179.aspx)مایکروسافت به شدت تشکر می کنم که نکات همزمانی تردها رو به من یاد داد.
و همچنین از جناب hossein-khoshseyar بابت تذکر نکات ریز و مهم.

hossein-khoshseyar
یک شنبه 24 بهمن 1389, 13:31 عصر
بالاخره درستش کردم



ممنون .فرمایشاتتون خیلی به دردم خورد.

سلام دوستان
من به این نتیجه رسیدم شما هیچکدومتون تا حالا به صورت جدی با ترد کار نکردید و در نتیجه هیچ برنامه چندنخی درست حسابی ننوشتید.
من تو این مدت داشتم روی ترد تحقیق می کردم و تابحال چیزهای جالبی هم یاد گرفتم.
این کاری که خودم می خواستم رو هم انجام دادم با استفاده از mutex .
شی ای است که تضمین می کند یک تکه کد بصورت همزمان فقط در یک ترد اجرا شود.
من از این شی استفاده کردم و شی تصویرمو قفل کردم و اینطوری مشکل دسترسی دو تا ترد با هم به یک شی رفع شد
در هر صورت من سورس این برنامه رو می ذارم تا شما هم ببینید و انشاالله استفاده کنید
و در آخر از مقاله Thread Synchronization (C# and Visual Basic) (http://msdn.microsoft.com/en-us/library/ms173179.aspx)مایکروسافت به شدت تشکر می کنم که نکات همزمانی تردها رو به من یاد داد.
و همچنین از جناب hossein-khoshseyar بابت تذکر نکات ریز و مهم.
دوست عزیز خوشحالم که بلاخره جوابتو گرفتی
ما که در زمینه ترد و چیزای دیگه ادعایی نداریم
ولی خیلی خوب بود که نکاتی و چیزایی رو که در این زمینه جدید یاد گرفتید تحت عنوان مقاله و یا اموزش توی این تاپیک یا یک تاپیک جدید قرار بدید تا همه بتونن ازش استفاده کنن (اگه چنین کاری کردید ممنون میشم با یک پیغام خصوصی به من اطلاع بدید)
من قبلا هم گفتم که توی این سایت اطلاعات راجع به ترد خیلی کم و سطحی هست. و خوبه که اطلاعاتمون رو این چنین زمینه پر کاربردی بالا ببریم

hero4000
دوشنبه 25 بهمن 1389, 16:31 عصر
بالاخره درستش کردم



ممنون .فرمایشاتتون خیلی به دردم خورد.

سلام دوستان
من به این نتیجه رسیدم شما هیچکدومتون تا حالا به صورت جدی با ترد کار نکردید و در نتیجه هیچ برنامه چندنخی درست حسابی ننوشتید.
من تو این مدت داشتم روی ترد تحقیق می کردم و تابحال چیزهای جالبی هم یاد گرفتم.
این کاری که خودم می خواستم رو هم انجام دادم با استفاده از mutex .
شی ای است که تضمین می کند یک تکه کد بصورت همزمان فقط در یک ترد اجرا شود.
من از این شی استفاده کردم و شی تصویرمو قفل کردم و اینطوری مشکل دسترسی دو تا ترد با هم به یک شی رفع شد
در هر صورت من سورس این برنامه رو می ذارم تا شما هم ببینید و انشاالله استفاده کنید
و در آخر از مقاله Thread Synchronization (C# and Visual Basic) (http://msdn.microsoft.com/en-us/library/ms173179.aspx)مایکروسافت به شدت تشکر می کنم که نکات همزمانی تردها رو به من یاد داد.
و همچنین از جناب hossein-khoshseyar بابت تذکر نکات ریز و مهم.

دوست عزيز من همون برنامه اولي شما رو تست کردم و به راحتي جواب گرفتم . فقط 2 نکته رو رعايت کردم
1-شرطهائي که توي thread ها گذاشته بودين رو برداشتم .
2- برنامه رو Build کردم و بعد اجرا کردم ( شايد اشکال از دست گذاشتن ويژوال استديو روي برنامه هستش )

شما هم تست کنيد ببينيد همينطوري درست ميشه :چشمک:

محسن شامحمدی
سه شنبه 26 بهمن 1389, 11:02 صبح
دوست عزيز من همون برنامه اولي شما رو تست کردم و به راحتي جواب گرفتم . فقط 2 نکته رو رعايت کردم
1-شرطهائي که توي thread ها گذاشته بودين رو برداشتم .
2- برنامه رو Build کردم و بعد اجرا کردم ( شايد اشکال از دست گذاشتن ويژوال استديو روي برنامه هستش )

شما هم تست کنيد ببينيد همينطوري درست ميشه :چشمک:

عجیبه که واسه شما شده
کارایی که شما گفتین رو کردم و برنامه رو اجرا کردم. بعد از پرتاب شدن یک exception برنامه بسته شد.
که دلیلش هم که می دونید دسترسی همزمان 2 ترد به اون شی هستش.

hero4000
چهارشنبه 27 بهمن 1389, 08:40 صبح
دوست عزيز من دوباره پروژتون رو دانلود کردم و همون تغييراتي رو که گفتم انجام دادم و بويلد هم کردم بدون مشکل اجرا شد

براي اطمينان شما هم کل پروژه تغيير يافته رو ضميمه کردم که نگاه کنيد

فقط يک نکته : واسه اينکه اشکال رو پيدا کنيد اول فايل اجرائي بويلد شده من رو اجرا کنيد ببينيد خطا داره يا نه بعد با ويژوال خودتون مجدد کامپايل و اجرا کنيد :چشمک:

محسن شامحمدی
جمعه 29 بهمن 1389, 10:42 صبح
اول فايل اجرائي بويلد شده من رو اجرا کنيد ببينيد خطا داره يا نه ؟
بله دقیقا همون خطای قبلی.
حالا بی خیال مهم نیست.
مهم اینه که این تکنیک کاری کلا اشتباهه.
دلیلش هم دسترسی همزمان 2 ترد به یک آبجکته.
حتی اگر برای من وشما خطا هم نده دال بر اجرای صحیح برنامه در همه شرایط نمی شه!