PDA

View Full Version : Synchronize کردن Thread ها



Developer Programmer
چهارشنبه 29 آبان 1387, 09:08 صبح
توی یک برنامه تحت شبکه که با indy 9 پیاده سازی میشه، لازمه که اسامی کلاینتها رو به یک لیست منتقل کنم...
چطور میتونم موقتا دسترسی سایر ترید ها رو ببندم؟
حتما باید از Synchronize استفاده کنم؟ میشه Synchronize رو وسط برنامه و خارج از متد Execute استفاده کرد؟

Hamid_PaK
پنج شنبه 30 آبان 1387, 17:35 عصر
واسه متوقف کردن دسترسی ترد های دیگه می تونی از یه بولی استفاده کنی که اگه True شد ترد های دیگه فعلا در حلقه بمونند.
در مورد Sync هم این روال تنها کار که انجام میده اینه که روال مورد نظر شما رو در ترد اصلی برنامه اجرا میکنه، به هر حال استفاده از اون در خارج از ترد هیچ فایده ای نداره.

یا حق ...

vcldeveloper
پنج شنبه 30 آبان 1387, 17:44 عصر
خود Indy لیست Threadهای مربوط به کلاینت های متصل شده را در یک لیست Thread-Safe نگهداری میکنه. اگر بخوای خودت لیستی از کلاینت ها داشته باشی، باید دید که آیا چندین Thread به اون دسترسی دارند یا نه. اگر نه، که نیازی به Synchronize نیست، اگر آره، باید حتما Synchronize بشه. البته فکر کنم خودِ دلفی امکان Lock کردن لیست رو بده، یا شاید هم یکی از مشتقات TList این قابلیت رو داشت، الان یادم نیست چه کلاس لیستی بود.

Developer Programmer
پنج شنبه 30 آبان 1387, 18:29 عصر
علی جان، TThreadList اون قابلیت رو که میگی داره اما نمیدونم چه بلایی سر پروژه آوردم که TThreadList قاط میزنه ... از TCriticalSection استفاده کردم اونم قاط زد ! :لبخند:

Type
PClient= ^TClient;
TClient = Record
IP : String[15];
HostName: String[40];
NickName: String[10];
Player2NickName: String[10];
XO : Char;
IsTurn: Boolean;
Free: Boolean;
Thread:Pointer;
end;

var
lock: TCriticalSection;
begin
try
lock.Acquire;
Clients.Add(PClient(AThread.Data) );
finally
lock.Release
end;

علی، لازمه که TCriticalSection رو Create کنم؟!

خود Indy لیست Threadهای مربوط به کلاینت های متصل شده را در یک لیست Thread-Safe نگهداری میکنه
میشه بهش دسترسی داشت؟!