![]() |
|
|||||||
| ثبت نام | کتابخانه فایل ها | راهنما | لیست کاربران | کلوب های کاربران | همه قسمت ها ، به عنوان خوانده شده علامت گذاری شوند |
| مقالات مرتبط با Delphi/Win32 مقالات مرتبط با Delphi از جمله مطالب مرتبط با برنامه نویسی در آن، مباحث مرتبط با کامپوننتها و ابزارها و ... در این بخش قرار میگیرند. |
![]() |
|
|
ابزار های تاپیک | طریقه نمایش |
|
|
#1 |
|
مدیر بخش
![]() ![]() ![]() ![]() ![]() |
استفاده از Thread ها در دلفی ...
به نام خدا
استفاده از Thread ها در دلفی اساس کار ویندوز در اجرای برنامه ها بر روی Thread ها است ، هنگامی که برنامه ای اجرا می شود ، کلیه کدها و فایلهای منبع ( Resource ) آن در یک یا چند Thread قرار می گیرند ، درواقع هرProcess در ویندوز دارای یک یا چند Thread است که اطلاعات Process درآنها قرار دارند و بر روی حافظه موقت بارگذاری شده اند ... ، برنامه ها میتوانند در زمان اجرای خود Thread هایی ساخته و سپس آنها را آزاد نمایند ، کار یک Process زمانی به پایان می رسد که تمام ، Thread های آزاد شده باشند ، در غیر این صورت آن Process بسته نخواهد شد ، پس باید در آزادسازی Thread ها دقت زیادی داشت ... ساخت Thread و استفاده از آن در برنامه : در دلفی کلاسی به نام TThread قرار دارد که امکان استفاده از Thread ها را فراهم می سازد ... برای استفاده از یک Thread ابتدا باید یک نسخه از کلاس TThread را Create کرده و سپس از آن استفاده نمایید برای ساخت یک Thread به صورت زیر عمل می کنیم : کد:
Type
MyThread = Class(TThread)
private
…
protected
...
end;
در یک Thread میتوانید Procedure ها و توابعی را قرار داده و از آنها استفاده نمایید ، توجه داشته باشید که برای فراخوانی توابع و متد ها باید از روش Synchronization ( همزمان سازی ) استفاده نمایید ، شاید با دیدن این کلمات احساس کنید که کار سختی در پیش دارید ، اما اصلا این طور نیست ، این کار با اجرای یک تابع ساده امکان پذیر است که در ادامه توضیح خواهیم داد ... Thread ها یک Event اصلی به نام OnExecute دارند که مربوط به زمان اجرا شدن آنها است ، تمام کار Thread ها در همین Event انجام می شود ، کدی که در این رویداد می نویسید از زمان اجرا شدن Thread تا زمان Terminate شدن آن اجرا خواهد شد. نمی توان در یک Thread به صورت مستقیم با اشیای فرم ارتباط داشت ، چنین درخواستهایی از Thread باعث متوقف شدن کار آن خواهد شد و نتیجه مطلوبی نخواهید گرفت ... ، برای دسترسی به اشیاء باید از Procedure های جدا و Synchronize استفاده نمایید تا اختلالی در کار Thread به وجود نیاید ... ابتدا باید توابع و متد ها را در یک Thread تعریف کرده و کد مورد نظر را در آن بنویسیم ، سپس با تابع Synchronize به روش زیر می توانیم آن را اجرا نماییم : کد:
Synchronize( My Procedure ); کد:
Type MyThread = Class(TThread) private procedure doProgress; end; Implementation procedure doProgress; begin Form1.ProgressBar1.Progress; end; در بالا نحوه تعریف یک Thread را توضیح دادیم ، برای استفاده از آن باید یک متغیر با نام Thread تعریف شده تعریف نماییم و از آن استفاده کنیم ... نکته دیگر این که متد Create برای Thread ها یک پارامتر به نام Suspended دارد که از نوع Boolean می باشد و به صورت پیشفرض دارای مقدار False است ... این پارامتر مشخص میکند که آیا Thread در حالت متوقف ساخته شود یا اینگه بعد از ساخته شدن بلافاصله در حالت اجرا قرار گیرد ( Thread بعد از ساخته شدن ، متد Execute اش اجرا خواهد شد ، با True کردن این پارامتر ، متد Execute را متوقف کرده و از اجرا شدن کدها جلوگیری می نماییم ) ، بعد از اجرای Thread ممکن است نیاز باشد که برخی از خصوصیات آن را تغییر دهیم ، پس باید به این پارامتر مقدار True دهیم تا Thread ما بعد از ساخته شدن در حالت اجرا نباشد و امکان تغییر خاصیتهای آن وجود داشته باشد ... برای مثال بهتر است که خاصیت FreeOnTerminate مربوط به Thread ساخته شده را True نماییم تا هنگام فراخوانی متد Terminate برای پایان کار Thread ، آن را آزاد کنیم ... پس کد ما تا اینجا به شکل زیر درخواهد آمد : کد:
var T : MyThread; begin T := MyThread.Create(True); T.FreeOnTerminate := True; T.Resume; end; کد نویسی در رویداد OnExecute : هر Thread ای که Create می کنید در حالت پیشفرض رویداد OnExecute را دارا می باشد ، برای این که آن را به دلخواه خود تغییر دهید باید آن را دوباره تعریف کنید ، برای تعریف این رویداد باید از قسمت Protection و واژه Override استفاده نمایید تا رویداد قبلی Thread از بین رفته و رویداد جدیدی که ایجاد می کنید جایگزین شود ، پس کد شما به این صورت خواهد بود : کد:
type MyThread = Class(TThread) private ... protected procedure Execute; override; end; var implementation procedure MyThread.Execute; begin end; برای فراخوانی Procedure هایی که تعریف کرده اید باید ار تابع Synchronize استفاده نمایید ( در داخل رویداد OnExecute ) ، برای مثال : کد:
procedure MyThread.Execute; begin Synchronize(doProgress); end; مدیریت Thread : برای استفاده از Thread با متدهای آن آشنایی داشته باشید ... برای متوقف کردن یک Thread باید از متد Suspend استفاده نمایید ، و برای ادامه کار آن باید از متد Resume استفاده کنید : کد:
MyThread.Suspend; ... MyThread.Resume; کد:
var isSuspended : Boolean; begin isSuspended := MyThread.Suspended; end; اگر در محیط ویندوز برنامه Task Manager را اجرا نموده و به قسمت Process بروید لیست Process های در حال اجرا را می بینید ، اگر بر روی هر کدام از این Process ها راست کلیک نمایید گزینه ای به نام Set Priority می بینید که مقادیری مثل High ، Normal یا Low و ... دارد ، Priority مشخص می کند که در زمان الویت بندی اجرای Thread ها در CPU ، کدام یک ارجعیت دارند و به CPU ابتدا باید به درخواست کدام یک از آنها جواب دهد ، هرچه مقدار Priority یک Thread مقدار بالاتری داشته باشد ، الویت بیشتری خواهد داشت و عملیاتش زودتر انجام خواهد شد ... می توانید برای Threadخود این خاصیت را تنظیم نمایید ، این خاصیت از نوع TThreadPriority می باشد ، در تصویر زیر مقادیری که می توانید به عنوان Priority قرار دهید مشخص شده است : ![]() ThreadID : این خاصیت شناسه ای برای Thread شما است که هم در زمان ساخت ( در زمان Debug ) و هم در زمان اجرای برنامه می توانید از آن استفاده نمایید ، هنگامی که قصد Debug کردن برنامه خود در محیط دلفی را دارید ، پس از اجرا کردن برنامه اگر از منوی View گزینه Debug Windows و سپس گزینه Threads را انتخاب نمایید ، پنجره ای باز شده و لیستی از Thread های در حال اجرا در برنامه شما را نمایش میدهد که هرکدام از آنها دارای شناسه ای به نام ThreadID هستند ، با داشتن این مقدار می توانید Thread مورد نظر خود را در این پنجره پیدا نمایید ... این مقدار را می توانید به روش زیر بدست آورید : کد:
var MyThreadID : Cardinal; begin MyThreadID := MyThread.ThreadID; end; ![]() خروج از Thread و آزاد کردن آن : رویداد OnTerminate : Thread یک رویداد دیگر دارد که میتوانید آن را مانند OnExecute تنظیم نمایید و تغییر دهید ، این رویداد زمانی اتفاق می افتد که Thread مورد نظر Terminate شود ، اما متد دیگری به نام DoTerminate وجود دارد که این رویداد را اجرا میکند بدون اینکه Thread مورد نظر Terminate شود ( یا شده باشد ) ، با متد ... --------- اگر یادتان باشد ، ما در هنگام ساخت Thread مقدار خاصیت FreeOnTerminateآن را True کردیم پس اگر آن را Terminate نماییم ، آزاد ( Free ) خواهد شد ، با متد Terminate میتوانید به کار یک Thread پایان دهید : کد:
MyThread.Terminate; کد:
procedure MyThread.Execute; begin Synchronize(doProgress); … MyThread.Terminate; Exit; end; کد:
procedure MyThread.Execute;
begin
if MyThread.Terminated then
Exit;
…
if MyThread.Terminated then
Exit;
…
MyThread.Terminate;
Exit;
end;
کد:
procedure MyThread.Execute;
begin
if MyThread.Terminated then
Exit;
…
if MyThread.Terminated then
Exit;
…
MyThread.Terminate;
MyThread.WaiteFor;
Exit;
end;
امیدوارم مفید بوده باشه ... PDF این مقاله رو می تونید از اینجا دانلود کنید ... موفق باشید ...
__________________
Espera por mí, yo vengo ... ! , Oye Dios, El fuego me !! Debe construir un Barco ... --------------------------------- --------------------------------- به روز شد ( 06 / 06 / 89 ) ---------------------------------
آخرین ویرایش به وسیله Mahmood_N : جمعه 10 آبان 1387 در 15:55 عصر |
|
|
|
| 31 کاربر از Mahmood_N به خاطر این مطلب مفید تشکر کرده اند: | ahmadr, AliReza Vafakhah, AlirezaBahredar, amin_alexi, Amir_Safideh, bhz8181, bootshow, cayberfox, Delphi Skyline, Delphi-7, echoes, hadiaj168, hojjatcroos, malekiyan, mehdimdp, mehdi_khepel2004, Modernidea, Mohammad_Mnt, mohsen57, MSN_Issue, nilidelphi, Nima NT, Pascal, s.mostafa.rahmani, saeed_hf52, sma_mohseni, xboycooper, Zahed2008, __Genius__, دنیای دلفی, شبیر کریمی |
|
|
#2 |
|
کاربر دائمی
![]() تاریخ عضویت: مرداد 1387
محل زندگی: مشهد - shervinfarzin@gmail.com
پست: 261
تشکرها: 13
191 بار تشکر شده در 139 پست
|
نقل قول: مقاله : استفاده از Thread ها در دلفی ...
با سلام
آقا يه سوال . من با delphi 2007 كار ميكنم و براي thread كه تعريف كردم هيچ Propertie يا تابعي به نام Stop نميبينم . مشكلم از چيه ؟ ممنون |
|
|
|
|
|
#3 | |
|
مدیر کل سایت
![]() |
نقل قول: مقاله : استفاده از Thread ها در دلفی ...
نقل قول:
1- Thread را با استفاده از متد Suspend معلق کنید. 2- Thread را با استفاد از تابع TerminateThread متوقف کنید؛ این روش یک نوع توقف اضطراری هست، نه توقف طبیعی. 3- متد Terminate از TThread را اجرا کنید، یا خصوصیت Terminated آن را True کنید. متد Terminate به خودی خود کاری انجام نمیده، فقط Terminated را True میکنه. از طرفی True کردن Terminated باعث توقف Thread نمیشه، بلکه Thread باید مرتبا در کدی که توسط متد Execute اجرا میشه، بررسی کنه که آیا Terminated برابر True شده یا نه، اگر شده، اجرای متد Execute را پایان بده. پایان یافتن متد Execute موجب متوقف شدن Thread میشه. البته دقت کنید که متوقف شدن Thread به معنی آزاد شدن شی آن نیست، بلکه یا باید خصوصیت FreeOnTerminate را True کنید تا بعد از متوقف شدن Thread، شی آن آزاد هم بشه، یا خودتان متد Free را فراخوانی کنید.
__________________
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت. |
|
|
|
|
| 5 کاربر از علی کشاورز به خاطر این مطلب مفید تشکر کرده اند: |
|
|
#4 |
|
کاربر دائمی
![]() |
نقل قول: مقاله : استفاده از Thread ها در دلفی ...
سلام
زمانی که یک Thread ایجاد میکنیم اگر لازم باشه از متدها یا اشیای برنامه اصلی استفاده بشه باید حتماً کد مورد نظر در یک پروسیجر یا تابع نوشته بشه و سپس اون رو توسط متد Syncronize صدا بزنیم. این نکته ای هستش که ادیتور دلفی موقع ایجاد یک Thread Object به صورت کامنت بهش اشاره میکنه: کد:
{ Important: Methods and properties of objects in VCL or CLX can only be used
in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure myTred.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
برای اینکه این بتونید منظورم رو بفهمید کافیه داخل Thread تابعی مثل Sleep رو استفاده کنید و بعد از صدا زدن Thread در برنامه اصلی یک ShowMessage بکار ببرید تا ببینید چی میشه. اتفاقی که میوفته اینه که پنجره ی دستور ShowMessage باز میشه ولی داخلش دکمه ی OK و متن وجود نداره! تا زمانی که اجرای Thread به پایان برسه. اگه نخواهیم اینجوری بشه باید چکار کرد؟ ممنون شبیر
__________________
|
|
|
|
|
|
#5 | |
|
مدیر کل سایت
![]() |
نقل قول: مقاله : استفاده از Thread ها در دلفی ...
نقل قول:
بطور خلاصه، متد Synchronize یک روش ابتدایی برای همزمان سازی Threadها هست. در این روش، موقع اجرای متد، Thread مورد نظر متوقف میشه، و تابع مورد نظر توسط Synchronize در Context مربوط به Thread اصلی اجرا میشه. یعنی عملا در لحظه اجرای کد مربوطه توسط Synchronize دو Thread که بصورت موازی در حال اجرا بودند، بصورت سری (پشت سر هم) اجرا میشند. برای همین هم Synchronize فقط بدرد همزمان سازی های ساده میخوره. برای کارهای پیچیده تر، یا کارهایی که نیاز به کارایی بالاتری دارند، باید از روش های دیگه ایی استفاده کرد. مثلا برای بروز رسانی رابط کاربر، ارسال پیام به Thread اصلی که مسئولیت بروز کردن رابط کاربر را داره، بهترین گزینه هست، چون نه Thread مورد نظر متوقف میشه، نه Thread اصلی نیاز داره کار فعلی خودش را متوقف کنه و بالافاصله درخواست Thread شماره 2 را اجرا کنه. پیام میره به صف پیام های Thread اصلی و Thread اصلی آن را پردازش میکنه. Thread شماره 2 هم بعد از ارسال پیام نیازی نداره منتظر باشه، بکارش ادامه میده. درباره اینکه چرا باید رابط کاربر همیشه از طریق Threadایی که آن را بوجود آورده، تغییر داده بشه هم توضیح داده شد، و گفته شد که این یکی از ضروریاتی هست که Win32 اعمال میکنه.
__________________
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت. |
|
|
|
|
|
|
#6 | |
|
کاربر دائمی
![]() |
نقل قول: مقاله : استفاده از Thread ها در دلفی ...
نقل قول:
ممنون ولی این کاری که گفتید رو چطوری میتونم یاد بگیرم و انجام بدم؟ قبلاً در موردش صحبت شده یا نه؟ چه مرجعی پیشنهاد می کنید؟ شبیر
__________________
|
|
|
|
|
|
|
#7 | |
|
مدیر کل سایت
![]() |
نقل قول: مقاله : استفاده از Thread ها در دلفی ...
نقل قول:
کد:
const TM_MYTHREAD_MSG = WM_USER + 200; TM_MYTHREAD_START = TM_MYTHREAD_MSG + 1; TM_MYTHREAD_PROGRESS = TM_MYTHREAD_MSG +2; TM_MYTHREAD_DONE = TM_MYTHREAD_MSG +3; کد:
PostMessage(FormHandle, TM_MYTHREAD_MSG, TM_MYTHREAD_START,0); کد:
TMyForm = class(TForm)
...
protected
procedure TmMyThreadMsg(var Msg: TMessage); message TM_MYTHREAD_MSG;
...
end;
----
procedure TMyForm.TmMyThreadMsg(var Msg: TMessage);
begin
case Msg.LParam of
TM_MYTHREAD_START : Progressbar1.Position := 0;
TM_MYTHREAD_PROGRESS : Progressbar1.Position := Progressbar1.Position + 1;
TM_MYTHREAD_DONE : Progressbar1.Position := Progressbar1.Max;
end;
end;
__________________
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت. آخرین ویرایش به وسیله علی کشاورز : جمعه 10 آبان 1387 در 11:17 صبح دلیل: تصحیح Message Handle به Message Handler |
|
|
|
|
| کاربرانی که به خاطر مطلب مفید علی کشاورز از وی تشکر کردهاند: |
|
|
#8 | |
|
کاربر دائمی
![]() |
نقل قول: مقاله : استفاده از Thread ها در دلفی ...
نقل قول:
__________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning
|
|
|
|
|
|
|
#9 |
|
کاربر دائمی
![]() |
نقل قول: مقاله : استفاده از Thread ها در دلفی ...
روش استفاده از terminateو ... که توضیح داده شده برای مواقعی که به صورت زیر استفاده شود
کد:
var T : MyThread; begin try T := MyThread.Create(True); T.FreeOnTerminate := True; T.Resume; finally t.terminate end;
__________________
خدایا ! به من آن ده که آن به ... |
|
|
|
|
|
#10 | ||
|
مدیر کل سایت
![]() |
نقل قول: مقاله : استفاده از Thread ها در دلفی ...
نقل قول:
نقل قول:
__________________
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت. |
||
|
|
|
![]() |
| بوک مارک کردن این تاپیک |
| Tags |
| AllocateHWnd, CriticalSection, Delphi Thread, Event, FreeOnTerminate, message, Mutex, دلفی, ثرید, Semaphore, Synchronization Objects, Synchronize, TerminateThread, Thread, TThread |
| کاربرانی که این تاپیک را مشاهده میکنند: 1 (0 کاربران و 1 مهمان) | |
| ابزار های تاپیک | |
| طریقه نمایش | |
|
|
تاپیک های مشابه
|
||||
| نام تاپیک | ایجاد کننده تاپیک | تالار | پاسخ | آخرین پست |
| پیاده سازی تایمر با استفاده از Thread | Ghasem Dehghani | برنامه نویسی در C# | 18 | شنبه 15 اردیبهشت 1386 18:10 عصر |
| اجرای تابع با پارامتر به صورت یک Thread. | hdv212 | برنامه نویسی در C# | 13 | چهارشنبه 12 اردیبهشت 1386 16:05 عصر |
| ایجاد thread | mahtab_18 | برنامه نویسی در C# | 1 | سه شنبه 11 اردیبهشت 1386 10:29 صبح |