PDA

View Full Version : مشکل در استفاده از کنترل IdAntiFreeze در کنار Timer



مهران رسا
چهارشنبه 08 اردیبهشت 1389, 10:58 صبح
با سلام

در قسمتی از برنامه باید Source تعدادی صفحه وب رو پشت سر هم و در یک بازه زمانی مشخص دریافت کنم . برای اینکار از کنترل TIdHttp که توسط یک تایمر فرخوانی میشه استفاده می کنم . هموطنور که در تاپیک های قبلی مطرح شد ، در زمان فراخوانی تابع Get کنترل TIdHttp فرم غیرقابل دسترس میشه و در اصطلاح هنگ می کنه . برای جلوگیری از رخ دادن این حالت جناب کشاورز کنترل IdAntiFreeze رو پیشنهاد کردند . در واقع استفاده از IdAntiFreeze انتخاب مناسب و ساده ای هست اما دقیقاً نمی دونم وقتی IdAntiFreeze در یک Timer فعال میشه چه اتفاقاتی رخ میده .

به طور خلاصه مشکل اینجاست که وقتی IdAntiFreeze در یک کنترل Timer فعال میشه (Active:=True) در خطوط بعدی برنامه امکان غیر فعال سازی تایمر وجود نداره (Timer.Enabled:=False) .

در واقع من با اینکار میخوام صفحات یک سایت رو به صورت مدیریت شده پیمایش کنم .


Doevents.Active := true;
PageSource := frmget.W2.Get(MainAddr);
Doevents.Active := false;
Timer1.Enabled := false;
Doevents.Active := true;
PageSource := frmget.W2.Get(MainAddr);
Timer1.Enabled := false;
Doevents.Active := false;


در هر دو حالت نتیجه ای حاصل نشد !

ممنون میشم راهنمایی بفرمایید

vcldeveloper
چهارشنبه 08 اردیبهشت 1389, 13:48 عصر
ببینید، از IdAntiFreeze انتظار کار فوق العاده ایی نداشته باشید. این کامپوننت فقط Application.ProcessMessages را فراخوانی میکنه. Timer هم برای کار خودش از Message استفاده میکنه. اگر فشار کار زیاد بشه، یا پردازش بعضی از پیام ها بیش از حد زمان ببره، ممکنه شما اون چیزی که مد نظرتون هست رو بهش نرسید.

در کارهای جدی تر باید برید سراغ استفاده از Thread.


در واقع من با اینکار میخوام صفحات یک سایت رو به صورت مدیریت شده پیمایش کنم .
یعنی دقیقا چی کار می کنید؟

مهران رسا
چهارشنبه 08 اردیبهشت 1389, 15:12 عصر
یعنی دقیقا چی کار می کنید؟

آدرس زیر رو در نظر بگیرید :


http://www.site.com/show.php?id=1

برنامه قراره سورس صفحات 1 تا 10 رو توسط تابع Get دریافت کنه . با استفاده از یک کنترل Timer و یک شمارنده قرار بود اینکار انجام بشه . اما به دلیل وقفه ای که هنگام فراخوانی get در فرم وجود میومد ، در کنار تایمر از IdAntiFreeze هم استفاده کردم که استفاده هم زمان از IdAntiFreeze و Timer هم مشکلات خودش رو داره .
از Thread استفاده کردم . بدون استفاده از متد Synchronize بازهم در فرم وقفه ایجاد شد .

البته یک راه دیگه هم الآن به ذهنم خورد . استفاده از رویداد OnWorkEnd کنترل TidHttp :متفکر: . یعنی زمانی که سورس صفحه دریافت شد به شمارنده یکی اضافه بشه و سورس صفحه بعدی درخواست بشه . شاید اینجا دیگه استفاده از IdAntiFreeze عملی باشه .

مهران رسا
چهارشنبه 08 اردیبهشت 1389, 15:59 عصر
مشکل برطرف شد . به کمک یه procedure و کنترل IdAntiFreeze میشه تایمری پیاده سازی کرد که Interval اون رو مدت زمان لازم برای تکمیل عملیات تابع Get مربوط به کنترل TidHttp تعیین میکنه . :لبخند:

rainstorm
یک شنبه 18 آذر 1397, 18:49 عصر
مشکل برطرف شد . به کمک یه procedure و کنترل IdAntiFreeze میشه تایمری پیاده سازی کرد که Interval اون رو مدت زمان لازم برای تکمیل عملیات تابع Get مربوط به کنترل TidHttp تعیین میکنه . :لبخند:

سلام میشه دقیق و با مثال توضیح بدین چیکار کردین؟

Mahmood_M
یک شنبه 18 آذر 1397, 21:21 عصر
این تاپیک برای 8 سال پیش هستش! ، لطفا مشکلتون رو در یک تاپیک جدید با توضیح کافی مطرح کنید
در هر صورت استفاده از TIdAntiFreeze خیلی توصیه نمیشه و کاربردی هم نداره، این کامپوننت کار خاصی انجام نمیده و فقط دستور Application.ProcessMessages رو فراخوانی می کنه
برای Freeze نشدن برنامه باید از Thread استفاده کنید، اگر درست پیاده سازی کنید هیچ نیازی به این کامپوننت نیست
این کامپوننت فقط برای استفاده در نسخه کلاینت و فقط برای کاربرانی که نمیخوان درگیر کار با Thread ها بشن قرار داده شده و راه حل مناسبی نیست