ورود

View Full Version : پردازش های موازی؟



AlirezaBahredar
پنج شنبه 21 شهریور 1387, 17:01 عصر
با سلام .....
شاید سوالی رو که مطرح می کنم سئوال خیلی از دوستان باشه(البته به ظن این حقیر).
شاید دیده باشید که در بسیاری از برنامه های استاندارد بالفرض مثال آنتی ویروس ها ، برنامه زمان اسکن کردن یک پارتیشن عملیات I/O بسیار سنگینی انجام می دهد.اما در عین حال شما براحتی وبدون Freeze شدن برنامه می توانید با قسمتهای دیگر برنامه مثل قسمت قرنتینه-قسمت Setting - حتی قسمت Update برنامه کار کنید.بدون آنکه برنامه پیغام Not responding رو بده.
منطقا این برنامه ها بدلیل ماهیت عملیاتشون بایستی از مفاهیم Multi Threading و مدیریت نخها استفاده کنند تا بتوانند از زمان CPU به بهترین نحو استفاده کنند.
من منکر این موضوع نیستم،اما در یک برنامه ساده خواستم این شیوه رو پیاده سازی کنم.اما نتیجه هیچ گاه همانند این برنامه ها حاصل نشده.با توجه به این موضوع که عملیات I/O من بسیار بسیار از نظر حجمی و باری که به CPU وارد می نمود کمتر از عملیات Chacking یک آنتی ویروس بود.
در برنامه من بنا بود یک IP Address با دستور Ping چک شود و در حین انجام این عملیات فرمی نمایش داده شود که به کاربر این آگاهی را بدهد که سیستم در حال کار می باشد.
با استفاده از یک نخ عملیات نمایش فرم انتظار را نمایش دادم.با اینکه روی فرم فقط یک Animation GIF ساده بود اما برنامه به سختی فرم را با تاخیر چند ثانیه ای و آنهم با زحمت باز نمود.این مطلب رو هم اضافه کنم که من متد synchronization روهم رعایت کرده بودم.اما....
در هر صورت از دوستان بزرگ و صاحب نظر در این حیطه تقاضا دارم در صورت امکان منو راهنمایی کنند.(لطف می کنند که با مثال، عنایتشون رو چندین برابر کنند.)
با تشکر

Mahmood_M
پنج شنبه 21 شهریور 1387, 21:10 عصر
یک امکانش این هست که شما اجرای دستور Ping رو خارج از Thread و قبل از اون انجام دادید ..
مثلا به صورت زیر :


Procedure ...
begin
Ping(0.0.0.0);
MyThread.Execute;
end;

در این صورت تا نوبت به اجرای Thread برسه زمانبر خواهد بود ، احتمال اینکه دلیل کند بودن عملیات چک کردن IP باشه خیلی زیاد هست ، لطفا بگید که کدهاتون چطوری و کجا اجرا میشن ...

...

vcldeveloper
جمعه 22 شهریور 1387, 01:42 صبح
این مطلب رو هم اضافه کنم که من متد synchronization روهم رعایت کرده بودم.اما....
یعنی برای نمایش نتیجه کار Thread در رابط کاربر، از متد Synchronize استفاده کردید؟ اگر بله، علت مشکلی که مطرح کردید، احتمالا همین هست. درباره متد Synchronize و نحوه کارکردش قبلا بارها در سایت توضیح داده شد.

AlirezaBahredar
جمعه 22 شهریور 1387, 12:06 عصر
محمود جان...
از اونجایی که عملیات Ping رو با Indy انجام دادم و با عنایت به این نکته که خود ایندی مدیریت Thread داره پس به نظر نمی رسه عدم کند بودن به این خاطر باشه.
علی آقا ...
جواب سئوال شما هم مثبت هست.
آقا محمود ، شما که ید طولایی در این زمینه داری(مخصوصا مقاله خوبی که تو سایت گذاشتی) می تونی منو راهنمایی کنی یک منبع مناسب واسه بحث کار با Thread ها معرفی کنی.
ببین قصد من بهینه کردن برنامه هاست.به عبارتی می خوام یک برنامه ساده که در عین حال چند کار ساده رو انجام می ده رو بتونم با مفاهیم Multi Threading بنویسم.اگه یک مثال ساده هم داشته باشی که اینجا بذاری کمک بزرگی می کنی.
با تشکر.....

Mahmood_M
جمعه 22 شهریور 1387, 13:46 عصر
آقا محمود ، شما که ید طولایی در این زمینه داری(مخصوصا مقاله خوبی که تو سایت گذاشتی) می تونی منو راهنمایی کنی یک منبع مناسب واسه بحث کار با Thread ها معرفی کنی.
ممنون ، ولی این طورها هم نیست ، ما هرچی داریم از استاد کشاورز داریم ...
اون طور که از سئوالتون مشخصه مشکل در یک برنامه خاص نیست و می خواید اطلاعات کاملی در مورد نحوه استفاده از Thread ها داشته باشید ...
در این صورت مقالات زیر میتونه کمک کنه ( همرا مثال هم هستند ) :

http://www.delphicorner.f9.co.uk/articles/op4.htm
http://www.delphicorner.f9.co.uk/articles/op1.htm
http://dn.codegear.com/article/22411


در سایت About (http://www.Delphi.about.com) هم میشه مطالب خوبی پیدا کرد ...

موفق باشید ...

vcldeveloper
جمعه 22 شهریور 1387, 17:23 عصر
علی آقا ...
جواب سئوال شما هم مثبت هست.
همین عبارت Synchronize را در بخش دلفی جستجو کنید، اون وقت متوجه میشید چرا با اینکه از Thread جداگانه ایی استفاده کردید، باز هم برنامه تون کند بود.

Mahmood_M
جمعه 22 شهریور 1387, 17:40 عصر
همین عبارت Synchronize را در بخش دلفی جستجو کنید، اون وقت متوجه میشید چرا با اینکه از Thread جداگانه ایی استفاده کردید، باز هم برنامه تون کند بود.

http://barnamenevis.org/forum/showthread.php?t=100296 <<