PDA

View Full Version : ترد - آشنایی با ترد - نحوه بکارگیری در دلفی و ترفندهای استفاده



آیدا رضایی
چهارشنبه 24 اسفند 1384, 01:01 صبح
دوستان میشه لطف کنید اگه منبعی در مورد ماهیت تردها . نحوه بکارگیری صحیح اونها در برنامه و ترفندهای استفاده از اون (در صورت وجود) رو در اختیار من بگذارید .
ممنون میشم .

vcldeveloper
چهارشنبه 24 اسفند 1384, 01:53 صبح
جستجو را فراموش نکنید:
http://www.barnamenevis.org/forum/showthread.php?t=26406
اون کتاب Martin Harvey را هم حتما بخونید، می تونید بصورت مجانی در اینترنت پیداش کنید.

آیدا رضایی
چهارشنبه 24 اسفند 1384, 02:13 صبح
خیلی ممنونم جناب کشاورز.
میشه لطف کنید و بگید اسم کتابش چی هست ؟

آیدا رضایی
چهارشنبه 24 اسفند 1384, 02:18 صبح
باز هم از سوال تکراری عذر میخوام . در تاپیک مربوطه نام کتاب رو یافتم .
ممنون. خیلی جامع و روشن توضیح داده بودید .

Ehsansh
چهارشنبه 24 اسفند 1384, 09:37 صبح
http://delphi.about.com/od/kbthread/index.htm

Delphi Skyline
پنج شنبه 25 اسفند 1384, 10:04 صبح
آقای کشاورز اگر ما بخواهیم مقدار Memo را که مثلا 1000 خط است هر چند لحضه یک بار چک کنیم و مقادیر را در Listbox بریزیم چه طوری باید از Thread استفاده کنیم . آخه بازم سرعت میاد پایین

آیدا رضایی
پنج شنبه 25 اسفند 1384, 11:44 صبح
من هم دقیقا یه همچین سوالی برام پیش اومده .
از ترد برای تقسیم یه پروسه سنگین میشه استفاده کرد .
آیا باید از چند ترد برای یک کار سنگین استفاده کرد ؟
روند اجرای ترد ها چطوریه ؟ (یعنی همه با هم اجرا میشن . البته این بسته به سوال قبلی هست ).
ترد در چه مواقعی بیشتر به درد میخوره ؟

vcldeveloper
جمعه 26 اسفند 1384, 06:09 صبح
اگر ما بخواهیم مقدار Memo را که مثلا 1000 خط است هر چند لحضه یک بار چک کنیم و مقادیر را در Listbox بریزیم چه طوری باید از Thread استفاده کنیم . آخه بازم سرعت میاد پایین
مسلما وقتی شما یک پردازش سنگین انجام میدید منابع سیستمی بیشتری مصرف میشه و کارایی سیستم کاهش پیدا میکنه، چه از Thread استفاده کنید و چه نکنید. هدف از استفاده از Thread ها اینه که یک برنامه بتونه یک یا چند پردازش سنگین خودش را به قسمت های کوچکتری تقسیم کند که هر قسمت بتونه مستقل از سایر قسمت ها وظیفه خودش را به انجام برسونه و برنامه هم بتونه مدت زمان بیشتری از وقت CPU را در اختیار داشته باشه - چون وقت CPU بین Thread ها تقسیم میشه، نه بین Process ها؛ پس هر چه یک برنامه Thread های بیشتری داشته باشه، فرصت بیشتری برای استفاده از CPU خواهد داشت.

در مورد مثال شما یک Thread فرعی می تونه داده ها را پردازش کنه و نتایج پردازش را بصورت Message برای Thread اصلی برنامه ،که وظیفه کنترل رابط کاربر را هم داره، ارسال کنه تا در Memo و ListBox نمایش داده بشه. البته غیر از Message ها میشه از روش های همزمان سازی دیگه ایی هم استفاده کرد، اما در مثال شما استفاده از Message کفایت میکنه.

vcldeveloper
جمعه 26 اسفند 1384, 06:20 صبح
آیا باید از چند ترد برای یک کار سنگین استفاده کرد ؟
روند اجرای ترد ها چطوریه ؟ (یعنی همه با هم اجرا میشن . البته این بسته به سوال قبلی هست ).

جواب این سوال ها بستگی به برنامه شما داره و نحوه طراحی اون داره. باید دید آیا یک پروسه سنگین را آیا میشه به چند قسمت کوچکتر تقسیم کرد و آیا هر قسمت باید با توجه به نتیج قسمت قبلی کاری را انجام بده یا می تونه بطور مستقل از سایر بخش ها هم عمل کنه.
بصورت عادی هر Thread وقتی شروع به اجرا شدن میکنه، مستقل از سایر Thread ها هست و اجرای اون جلوی اجرای سایر Thread ها را نمی گیره، پس اگر 5 Thread را پشت سر هم اجرا کنید، هر Thread بصورت جداگانه و بدون توجه به سایر Thread ها کار خودش را انجام میده. هر Thread یک مسیر اجرای کد هست، پس با اجرای 5 Thread در واقع برنامه شما در 5 جهت مختلف بصورت همزمان در حال اجرا شدن هست. البته از اونجایی که ممکن هست Thread با داده های مشترکی سر و کار داشته باشند، یا در بعضی از مواقع لازم هست که یک Thread عمل خاصی را بعد از پایان عملیات یک Thread دیگه انجام بده، روش های همزمان سازی Thread ها بوجود اومدند که از طریق اونها میشه روند اجرای Thread ها را در مواقع لزوم همزمان کرد یا از تداخلشان با هم جلوگیری کرد، مثلا زمانی که دو Thread قصد دارند در یک مکان مشترک از حافظه بطور همزمان چیزی بنویسند.

همچین مسائلی در همون کتابی که آقای Inprise در سایت معرفی کردند و بنده هم در تاپیک قبلی بهش اشاره کردم، توضیح داده شده.

Delphi Skyline
جمعه 26 اسفند 1384, 16:13 عصر
با تشکر از آقای کشاورز .
آقای کشاورز آیا تمام سیستم عامل ها همین طوری عمل می کنند یا مثلا لینوکس طور دیگه ای عمل می کنه ؟ (از نظر تقسیم و ... Thread ها)

vcldeveloper
شنبه 27 اسفند 1384, 01:34 صبح
آیا تمام سیستم عامل ها همین طوری عمل می کنند یا مثلا لینوکس طور دیگه ای عمل می کنه ؟ (از نظر تقسیم و ... Thread ها)
خیلی با سیستم عامل های مختلف آشنا نیستم، اما تا جایی که میدونم سیستم عامل های مدرن امروزی هم بطور کلی به همین صورت عمل می کند، البته ممکن جزئییات کارشون کمی با هم فرق داشته باشه.

Delphi Skyline
شنبه 27 اسفند 1384, 13:53 عصر
با تشکر . آقای کشاورز چه طوری میتونیم ترد هایی که خود دلفی وقت اجرای برنامه می سازه و کنترل کنیم .
اگه دقت کرده باشید در دلفی 2005 نشون می ده که مثلا الان ترد #68 اجرا شده و مثلا الان تایم آوت شده .

vcldeveloper
یک شنبه 28 اسفند 1384, 06:46 صبح
معمولا لازم نیست Thread هایی را که بصورت خودکار ایجاد میشند کنترل کنید. ولی هر Thread یک هندل داره که می تونید با استفاده از تابع DublicateHandle یا GetCurrentThread اون هندل را بدست بیارید و از طریق اون هندل Thread مورد نظر را کنترل کنید (SetThreadContext, ResumeThread, SuspendThread و...).

Delphi Skyline
یک شنبه 28 اسفند 1384, 09:48 صبح
با تشکر . آقای کشاورز اگه ما بیایم برنامه امون رو به جای تقسیم Thread به پرسس های جداگانه تقسیم کنیم (مثلا DLL های متفاوت) آیا کار عاقلانه ای است ؟

vcldeveloper
دوشنبه 29 اسفند 1384, 09:18 صبح
پرسس های جداگانه تقسیم کنیم (مثلا DLL های متفاوت) آیا کار عاقلانه ای است ؟
یک DLL یک Process جدا محسوب نمیشه و در فضای آدرس Process ایی که اون فراخوانی کرده لود میشه. ربطی به Threading نداره. DLL یک Module هست، نه یک Process.

Delphi Skyline
دوشنبه 29 اسفند 1384, 09:46 صبح
متشکرم ...