PDA

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



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

در قسمتی از برنامه باید 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;


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

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

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

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


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

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

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


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

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

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

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