ورود

نسخه کامل مشاهده نسخه کامل : درخواست نحوه پیاده سازی thread ها و ....



delphianddotnet
28-03-2007, 10:37
سلام
تا حدودی برنامه نویسی چند لایه رو بلدم .حالا میخوام نحوه پیاده سازی thread ها و اینکه چطوری باید با اونا کار کنیم رو میخوام بدونم.اگه مثال جامع و کامل همراه با توضیح بدید ممنون و سپاسگزار میشم

Mahmood_N
31-03-2007, 02:03
سلام
من قبلا قول آموزش این بحث رو داده بدم ولی متاسفانه وقت نشد ( راستش یه بار نوشتم ، دیگه آخراش بود ، برق رفت و دیگه بی خیال شدم ، یعنی وقت نکردم ) ...
ولی الان دیگه می نویسم ...
خوب ...
برای شروع کار اول باید یک کلاس از نوع TThread تعریف کنی ...
به کد زیر نگاه کن :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
توی یک بالا یک نوع از TThread ، به عنوان Thread مورد نظر معرفی شد ...
خوب حالا باید متغیر ها و کدهایی که توی استفاده از اون به کار می رند رو مشخص کنیم ...
برای تعریف متغیر ها ( البته اگه برای استفاده نیاز به متغیر داری ! ) ، باید اون رو بر حسب نیاز در قسمت Private یا Public تعریف کنی ...
به کد زیر نگاه کن :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در قسمتهای Private و Public می تونی Procedure ها رو هم تعریف کنی ...
مثلا فرض کن می خوایم یک برنامه بنویسیم که یک فایلی رو از Source ( منظور متغیریه که تعریف میکنیم و مسیر فایل مبدا رو می دیم بهش ) به Destination ( منظور متغیره که تعریف میکنیم و مسیر مقصد رو بهش میدیم ) کپی کنه و همچنین فرض کن برنامه ما یک شی Gauge داره که کپی شدن فایل رو به صورت Progress نمایش می ده ( میشه به جای Gauge از ProgressBar هم استفاده کرد ) ...
برای این کار باید یک متغیر از نوع String به نام Source ( مسیر مبدا ) و همچنین یک متغیر به نام Destination ( مسیر مقصد ) تعریف کنیم ...
چون باید در جاهایی ( منظور Procedure ها است ) ، غیر از Procedure های مربوط به خود Thread از اونها استفاده کنیم ( برای مقدار دهی ) پس اونها رو در قسمت Public تعریف میکنیم ...
بعد از تعریف این متغیرها به چند تا Procedure جدا احتیاج داریم که کارها رو انجام بدند ( کارهایی مثل Progress کردن Gauge و کار اصلی که همون کپی فایل هست ) ...
چون نیازی به دستکاری این Procedure ها در جاهای دیگه نیست ، پس اونها رو در قسمت Private تعریف میکنیم ...
البته متد ( Procedure ) اصلی که کار کپی رو انجام میده در قسمت Protected قرار می گیره ( بعدا توضیح میدم ) ...
تمام Thread ها یک Event دارن به نام OnExecute ( هنگام اجرا شدن ) که کار اصلیشون باید در همون Event باشه ، در توضیحات بالا منظورم از Procedure اصلی همین Event هست ...
کد زیر رو ببین :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در قسمت Private که مشخصه ( متغیرها تعریف شدند ) ، در قسمت Public ما 2 تا Procedure تعریف کردیم ، یکی برای Progress کردن Gauge و یکی هم برای نمایش پیغام ...
و در قسمت Protected هم متد Execute رو معرفی کردیم که کد اصلی توی اون قرار میگیره ...
اگه دقت کرده باشی ، در مقابل متد Execute ، کلمه Override نوشته شده ، هدف از نوشتن این کلمه اینه که متد اصلی Execute مربوط به خود Thread رو از بین ببره و از متد جدید استفاده کنه ...

خوب تا اینجا ما Thread رو ساختیم ، حالا باید کدهای مربوط به Procedure ها رو بنویسیم ، برای هر کدم کد مربوطه رو می نویسیم :
برای Progress :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای ShowMsg :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای استفاده از کد بالا باید یک متغیر از نوع String به نام Mess ( مقدار متن پیغام رو بهش میدیم ) تعریف کنی ( هر جا که خواستی ، توی کد مربوط به فرم یا توی قسمت Private یا Public مربوط به Thread ) تا پیغام دلخواهت رو نشون بدی ...
حالا کد اصلی رو توی Procedure مربوط به Execute می نویسیم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اگه به کد بالا دقت کنی ، برای فرخوانی توابع تعریف شده ( همون Progress و ... ) از تابع Synchronize استفاده شده ، این تابع درواقع کارش همینه و برای استفاده از Procedure های تعریف شده در یک Thread ، در داخل متد Execute ، باید اید از همین تابع استفاده بشه ( تابع Synchronize رو مینویسیم و بعد نام تابع رو در داخل پرانتز می نویسیم ) ...
می تونی آخر کد بالا ، تابع Synchronize رو برای نمایش پیغام ( (Synchronize(ShowMsg ) ، بنویسی و پایان کار رو نشون بدی ...
توی کد بالا و در حلقه While ، یعنی مهم ترین مرحله از کپی فایل ، ما چک میکنیم ، که Thread ما Terminate شده یا نه ، مثلا فرض کن ما داریم یک فایل رو کپی می کنیم ، حالا کاربری که داره با برنامه کار میکنه ، روی دکمه Cancel که ما برای متوقف کردن عملیات کپی گذاشتیم کلیک میکنه ، اینجاست که باید Thread ما Terminate بشه و در حلقه ای که توی کد بالا بود ، ما چک میکنیم که اگه Thread ما Terminate شده بود ، از حلقه خارج می شیم ( با دستور Break )
توجه :
برای شروع عملیات کپی ( وقتی که روی دکمه مثلا Copy در برنامه کلیک می شه ، باید Thread رو ساخته و کار اون رو شروع کنی ) ، به کد زیر نگاه کن :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
توی کد بالا در خط اول متغیری که رو که در قسمت Var تعریف کریدم ، به Thread خودمون نسبت میدیم و همزمان اون رو Create میکنیم ...
اون True ای که توی پرانتز نوشته شده ، برای اینه که در هنگام ساخت Thread مقدار Suspended اون True باشه ، یعنی به صورت Stop شده ساخته بشه تا بلافاصله بعد از ساخته شدن اجرا نشه !! ، بعد از کمی کار کردن با Thread ها مفهوم اینها رو بهتر می فهمی ، فقط این رو بگم که Thread ها یه جورایی شبیه به تایمر هستند ...
توی خط دوم ما خصوصیت FreeOnTerminate مربوط به Thread رو True کردیم ، هدف از این کار اینه که بعد از Terminate کردن ، Thread آزاد بشه و از بین بره ...
توی خطهای 3 و 4 هم مسیرهای مبدا و مقصد رو مشخص کردیم و د خط پنجم کار Thread رو شروع کردیم ، یعنی در هنگام ساخته شدن ، اون رو Stop کردیم و بعد Resume ( ادامه ) کردیم ...
امیدوارم توضیحات مفید باشه ...
یه نمونه هم برات گذاشتم :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

موفق باشی ...

delphianddotnet
05-04-2007, 11:57
سلام
محمود جان دستت درد نكنه واقعا" عالي بود.
ميتوني برام يه مثال از مولتي تاير ها بزني و برام بفرستي(خصوصي)
موفق باشيد