فکر کنم این تاپیک زیاد استقبال کننده نداره درسته؟
در هر صورت من ادامه آموزش رو می نویسم و می ذارم انشاالله که اهل فن استفاده کنند.
خب حالا رسیدیم سروقت یکی از مهمترین مباحث برنامه نویسی MultiThread به نام Synchronization
در برنامه نویسی چندنخی شما می توانید به نحوه اجرا و ترتیب اجرای Thread های تان نظم ببخشید.
ما به 2 دلیل از تکنیک های همزمان سازی استفاده می کنیم:
- برای کنترل کردن صریح ترتیب اجرای Thread ها.و تنظیم ترتیب اجرای کد Threadهای مختلف
- برای جلوگیری از مشکلاتی که می تواند هنگامی که دو Thread در یک زمان از یک منبع مشترک استفاده می کنند،اتفاق بیفتد
برای مثال شما از همزمان سازی می توانید در مواردی استفاده کنید که در یک Thread اطلاعاتی از سرور گرفته شود و در Thread دیگر آن اطلاعات در رابط کاربری نمایش داده شود.
استفاده از متد Join برای ترتیب دادن به اجرای Thread ها
با استفاده از متد join می توان به ترتیب اجرای Threadها نظم داد.
مثلا:
Sub JoinThreads()
Dim Thread1 As New System.Threading.Thread(AddressOf SomeTask)
Thread1.Start()
Thread1.Join() ' Wait for the thread to finish.
MsgBox("Thread is done")
End Sub
به تصویر زیر دقت کنید:
تکنیک های پیشرفته همزمان سازی
دات نت فریمورک چندین راه برای همزمان سازی Threadها دارد که در ذیل با آن ها آشنا می شویم.
AutoResetEvent
Interlocked
ManualResetEvent
Monitor
Mutex
ReaderWriterLock
Timer
WaitHandle
حال برای اینکه متوجه بشویم که همزمان کردن Threadها چه سودی دارد نگاهی به مثال زیر می کنیم.
یک دکمه بر روی فرم بکشید و کدهای زیر را در آن وارد کنید.
Control.CheckForIllegalCrossThreadCalls = False
Dim t1 As New Threading.Thread(AddressOf ToRight)
Dim t2 As New Threading.Thread(AddressOf ToLeft)
t1.Start()
سپس متدهای زیر را در کد قرار دهید.
Private Sub ToRight()
For i = 1 To 100
Button1.Left += 1
Me.Refresh()
Next
End Sub
Private Sub ToLeft()
For i = 1 To 100
Button1.Left -= 1
Me.Refresh()
Next
سورس با نام BadMove ضمیمه شده است.
حال برنامه را اجرا کنید و بر روی دکمه کلیک کنید.
نتیجه کار با کد هم خوانی ندارد!
در کد، نوشته بودیم که یک Thread آن را 100 واحد به راست برده و Thread دیگر 100 واحد به چپ. پس بعد از اجرای برنامه،دکمه دقیقا باید سر جای قبلی خود قرار بگیرد ولی قرار نگرفت.دلیل چیست؟؟؟؟
دلیل اینست که یک سری از کدها چون با یک منبع مشترک و در یک زمان اجرا می شود به خوبی اجرا نمی شوند.برای حل مشکل باید از تکنیک های همزمانی استفاده کنیم.
در پایین با استفاده از هر یک از اشیا معرفی شده مشکل را حل می کنیم.
آشنایی با اشیا همزمان سازی
Mutex
این شی در هر لحظه می تواند فقط در یک Thread فعال باشد و در بقیه Threadها غیرفعال می شود که این ویژگی سبب می شود که ما مطمئن شویم که کدههایمان بصورت همزمان فقط و فقط در یک Thread اجرا می شود.
این شی دو متد مهم دارد که عبارتند از:
WaiteOne: شی mutex را در این Thread فعال می کند
ReleaseMutex: شی mutex را آزاد می کند
در فایل edit with mutexbad move مشکل مزبور با استفاده ازاین شی حل شده است.
Monitor
این شی دو متد مهم دارد که عبارتند از:
Enter: یک شی را گرفته و آن را قفل می کند
Exit: یک شی را گرفته و آن را آزاد می کند
در فایل edit with monitorbad move مشکل مزبور با استفاده ازاین شی حل شده است.
Synclock
ویژوال بیسیک تضمین می کند که هر کدی که در این بلوک قرار گیرد بطور همزمان فقط در یک Thread اجرا می شود.
در فایل edit with synclockbad move مشکل مزبور با استفاده ازاین شی حل شده است.
تمرین: برای درک کامل مفهوم همزمان سازی به شدت پیشنهاد می کنم که این برنامه را دانلود کنید و با استفاده از تکنیک های همزمان سازی،مشکل دسترسی همزمان دو Thread به یک شی را حل کنید.
درس بعدی: اجرای تایمر ولی در یک Thread دیگر!!!