PDA

View Full Version : سوال: اختصاص دادن چند پروسیجر به یک thread



Mask
چهارشنبه 10 آذر 1389, 13:03 عصر
با سلام
یک thread به نام mythread ایجاد میکنم. و در پروسیجر مربوطه کدم رو مینویسم.
برنامه اجرا و دستور من رو در پروسیجر مربوطه و در thread ساخته شده اجرا و free میشه.
چطوری میتونم از همین mythread که ایجاد کردم.چندین پروسیجر رو فرا خوانی کنم؟

Felony
چهارشنبه 10 آذر 1389, 14:37 عصر
چطوری میتونم از همین mythread که ایجاد کردم.چندین پروسیجر رو فرا خوانی کنم؟
پروسیجر مربوط به کلاس Thread ی هست که ساختید یا نه ؟ در هر صورت :


type
TMyThread= class(TThread)
Private
Procedure Test2;
Protected
Procedure Execute; Override;
end;


Procedure Test1;
begin
ShowMessage('Test 1');
end;

{ TMyThread }

procedure TMyThread.Execute;
begin
inherited;
Test1;
Test2;
end;

procedure TMyThread.Test2;
begin
ShowMessage('Test 2');
end;

Mask
چهارشنبه 10 آذر 1389, 22:25 عصر
ممنون.
بله از همین myThread هست که ساختم.
کدتون رو دیدم.
منظورم اینه که تعداد پروسیجر استفاده شده نامحدود باشه.؟
شما با دستور بالا 2 تا پروسیجر رو اختصاص دادید.
میخام محدود نباشم.

Felony
چهارشنبه 10 آذر 1389, 22:35 عصر
چه محدودیتی ؟ محدودیتی وجود نداره ، هر چند تا Procedure میخوای توش صدا بزن !
فقط حواستون باشه که Procedure ها همزمان اجرا نمیشن بلکه به ترتیب اجرا میشن ، یعنی مثلا تو کد پایئن اول روال Test1 اجرا میشه و تا زمانی که کارش تموم نشه Thread در گیر هست و روال Test2 اجرا نمیشه ، وقتی کار روال Test1 تموم شد روند اجرای کد به رویداد Execute بر میگیرده و روال Test2 رو اجرا میکنه :


procedure TMyThread.Execute;
begin
inherited;
Test1;
Test2;
end;

telman
دوشنبه 29 فروردین 1390, 13:26 عصر
چرا اینجا از Inherited استفاده کردید؟

vcldeveloper
دوشنبه 29 فروردین 1390, 19:00 عصر
چرا اینجا از Inherited استفاده کردید؟
Execute متدی از کلاس TThread هست که به این کلاس جدید (TMyThread) به ارث رسیده، و override شده؛ پس میشه در آن inherited را فراخوانی کرد که موجب اجرای متد TThread.Execute میشه؛ اما در اینجا فراخوانی اون لازم نیست، چون TThread.Execute یک متد خالی هست، و کاری انجام نمیده.


چطوری میتونم از همین mythread که ایجاد کردم.چندین پروسیجر رو فرا خوانی کنم؟
یک Thread فقط یک procedure برای اجرا داره؛ Thread ایی که بخواد کدهای متنوع را از یک منبع بگیره و اجرا کنه، باید مکانیزم مورد نظر را در همون یک Procedure پیاده سازی کنه؛ یعنی در اون Procedure یک حلقه بذاره، در داخل اون حلقه یک صف از procedure ها رو چک کنه، و هر زمان که procedure جدیدی وارد صف شد، اون رو بگیره و اجرا کنه. برای اینکه بتونید همچین ایده ایی رو پیاده سازی کنید، می تونید درباره مسئله producer-consumer در مباحث Threading تحقیق کنید.