-
Notifications
You must be signed in to change notification settings - Fork 0
/
document-gui.txt
22 lines (20 loc) · 3.87 KB
/
document-gui.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
با ایجاد یک پروژه جدید (یک سولوشن جدید) در فرم سیشارپ، یک تابع پارشال (partial) بصورت خودکار ایجاد شده که ما به آن کاری نداشته و ذرهای آنرا دستکاری نمیکنیم
پس از قرار دادن ۳ جعبه متن (text box)، و ۳ برچسب (label) و نهایتا ۲ دکمه (button) روی فرم در قسمت طراحی (design)، ابتدا روی دکمه خروج (exit) دوبار کلیک کرده تا تابع مربوط به آن در فرم کد ایجاد شود و خط مربوط به اتمام برنامه را به آن اضافه میکنیم
پس از آن روی دکمه شروع (start) را دوبار کلیک میکنیم و روی تابع ایجاد شده ابتدا یک شی از کلاسمان ایجاد میکنیم
این کلاس به این علت ایجاد شده که با کلاس اصلی برنامه تداخل نداشته باشد و متغیرها و توابع خاص خود را درون خود داشته باشد
پس از آن جعبههای متن بررسی میشوند که خالی نباشند و در صورت خالی نبودن، جعبه متن سوم برای تعداد نخها بررسی شده و نهایتا تابع درون کلاس را صدا میزنیم
درون تابع صدا زده شده ابتدا به تعداد نخهای مورد درخواست کاربر، شی از کلاس فعلی ساخته میشود، و همچنین نخهای مورد نیاز نیز ساخته میشود
در بدنه try catch برای رسیدگی به خطاهای احتمالی نخها را برای شروع اجرا میکنیم
درون هر نخ نقطه شروع را با تابع زیر نشان میدهیم
ThreadStart
این تابع از فضای نامی زیر میباشد
System.Threading
بدین ترتیب هر نخ نقطه شروع به کار خود را میداند
پس از اینکه محل فایل مبدا و مقصد را به هر نخ، در سازنده کلاس پاس دادیم، شروع به کار نخ را با تابع زیر از نخها اعلام میکنیم
Start
درون هر نخ وضعیت بدین صورت است که ۳ متغیر مشترک (shared resource) وجود دارد که یکی شامل هد (head) خواندن فایل از فایل مبدا بوده و دوتای دیگر از نوع سمافور بوده و برای کنترل همروندی نخها استفاده میشود؛ توضیح اینکه از آنجایی که نخها از یک مکان میخوانند و در یک مکان مینویسند، باید بینشان کنترل همروندی صورت پذیرد و شرایط مسابقه (race condition) برای خراب کردن کار سایر نخها بوجود نیاید. در نتیجه کار هر نخ در هر مقطع بدین صورت است که خط به خط فایل را بخواند به گونهای که خط مذکور توسط دیگران خوانده نشود و روی فایل مقصد دوباره و سهباره نوشته نشود. پس از مکانیزم سمافور استفاده کردهایم که قفلی روی خواندن و نوشتن میگیرد و وقتی یک نخ قفل را نگه داشته باشد، دیگران نمیتوانند وارد شوند و روی تابع زیر منتظر میمانند تا قفل آزاد شود:
WaitOne
و تا زمانی منتظر میمانند که نخی که قفل را گرفته از طریق فراخوانی تابع زیر،آنرا آزاد کند:
Release
نهایتا توضیح کلی اینکه هر نخ فقط یک خط میخواند و هد (head) را یکی اضافه میکند تا نخ بعدی، خط مشترکی با قبلیها نخواند
پایان