PDA

View Full Version : سوال: ضعف Indy یا کد اشتباه Theard



Mask
یک شنبه 25 دی 1390, 12:06 عصر
با سلام.
نمونه زیر رو نوشتم. در این نمونه کد ، با زدن دکمه اول آی پی 127.0.0.1 که معتبر هست رو در یه Thread پینگ میکنیم.
سریعا جواب معتبر بودن آی پی نمایش داده میشه.
یه دکمه دوم هم دارم که در اون یه آی پی غیر معتبر رو در Thread جدا پینگ میکنم. که بعد از حدود 5 ثانیه(چون تایم اوت روی 5000 هست) جوابی مبنی بر نامعتبر بودن دریافت میکنیم.
مشکل از اینجا به وجود میاد که : اگه آی پی نامعتبر رو در دکمه دوم پینگ بکنیم . برنامه حدود 5 ثانیه زمان نیاز داره تا جواب رو نمایش بده. اما به محض کلیک بر روی دکمه دوم ، اگه دکمه اول رو که آی پی 127.0.0.1 رو پینگ میکنه بزنیم. برنامه نمایش میده که آی پی 127.0.0.1 معتبر و آی پی غیر معتبر رو هم ، معتبر اعلام میکنه و Threadی که در حال تلاش برای چک کردن آی پی نامعتبر بوده رو هم ترمینیت میکنه.
چرا؟
آیا این ضعف ایندیه که نمیتونه از یه سیستم همزمان 2 آی پی رو پینگ کنه یا مشکل کد نویسیه من؟
ممنون.

تجلی
دوشنبه 26 دی 1390, 09:29 صبح
این کد روی سیستم من اجرا نشد . هر دکمه ای رو زدم socket error میده . هیچ thread ی هم تعریف نشده بود . برنامه ای که آپلود کردید کامل نبود ؟

Mask
دوشنبه 26 دی 1390, 11:50 صبح
دست شما درد نکنه.
بی زحمت با دلفی 2009 به بالا اجراش کنید.
شما یونیت
Ping_SendM.pas
رو مطالعه بفرمایید. همیه چیز تو اونجاست

تجلی
دوشنبه 26 دی 1390, 12:15 عصر
از عبارت " دست شما درد نکنه " به نظرم برای شما سوء تفاهم شده . من میدونم شما دلفی کاری ، سوالی که پرسیدم به این خاطر بود که برنامه شما روی سیستمم اجرا نشد ، نسخه دلفی که دارم xe هست . ولی پیام socket error میده .

Mask
دوشنبه 26 دی 1390, 13:58 عصر
نه بابا
نیتم بد نبود. منظورم تشکر بود. که بعد چند روز یه نفر اومد کمک من.:قلب:

ولی پیام socket error میده .
اینو نمیدونم.

تجلی
دوشنبه 26 دی 1390, 15:19 عصر
خوب پس من دچار سوء تفاهم شده بودم .

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

اگر کد ها رو درست ندیده باشم عذر میخوام چون فعلا با برنامه خودم بد جوری سر درد گرفتم .

Mask
دوشنبه 26 دی 1390, 15:23 عصر
اختیار دارید.
به نظرم اینجوری نیست.چون با هر بار کلیک بر روی دکمه ها ،یه ترد جدید ساخته میشه. و تردها با متغیرهای درونی خودشون پر میشند.