PDA

View Full Version : شبیه سازی Application.ProcessMessages در سرویس (خیلی فوریه)



A.Nemati
پنج شنبه 24 آبان 1386, 20:55 عصر
سلام.
چطوری می‌تونم چنین کاری رو در یک سرویس انجام بدم؟


while not FileExists(tmp) do
begin
Sleep(1)
Application.ProcessMessages
end


اگر بتونید سریعتر راهنماییم کنید، واقعا ممنون می‌شم.

JAFO_IRAN
پنج شنبه 24 آبان 1386, 21:12 عصر
سرویس قاعدتا نباید ui داشته باشه و به همین دلیل بخشی از رفتار ProcessMessages که مربوط به ui میشه کاربردی نداره. بخش دیگر رفتار این متد که relinquish control باشه توسط sleep انجام میشه - پس به نظر میاد که sleep باید برای کار کردن داستان فوق کافی باشه...

ارادت

anubis_ir
پنج شنبه 24 آبان 1386, 21:28 عصر
از thread استفاده کنید.

A.Nemati
جمعه 25 آبان 1386, 19:02 عصر
ممنون از توجهتون
1- sleep فقط یک وقفه در ادامه کار می ده و اجازه نمی ده که proccessهای دیگه سیستم انجام بشن، بنابراین در نمونه کدی که تو سوالم نوشتم کاربردی نداره.
2- یعنی بخاطر یک proccessMessage یک thread بنویسم؟ تازه چطوری؟ thread چه کمکی در این زمینه به من می کنه؟

vcldeveloper
جمعه 25 آبان 1386, 21:55 عصر
- یعنی بخاطر یک proccessMessage یک thread بنویسم؟ تازه چطوری؟ thread چه کمکی در این زمینه به من می کنه؟
بله، وقتی سرویسی می نویسید که باید به چندین درخواست بصورت همزمان پاسخ بده، باید برنامه را بصورت Multi-threaded بنویسید.
Application.ProcessMessage هم کار خاصی نمی کنه، فقط در داخل حلقه مکثی ایجاد میکنه و پیام های رسیده را بررسی میکنه و پس از پاسخ دادن به آنها، حلقه را ادامه میده.

AlirezaBahredar
شنبه 26 آبان 1386, 23:19 عصر
A.Nemati عزیز ...منم دقیقا همین مشکل رو دارم.....یعنی توی یک سرویس می خوام معادل Application.ProcessMessages
رو استفاده کنم ...شما به نتیجه ای رسیدی؟

AlirezaBahredar
یک شنبه 27 آبان 1386, 08:34 صبح
از اساتید محترم کسی تا به حال به این مشکل بر نخورده؟ آقای نعمتی همچنان چشم در راه هستیمااااا.....

anubis_ir
یک شنبه 27 آبان 1386, 09:57 صبح
Application.ProcessMessage این توهم رو برای شما بوجود میاره که برنامه شما داره به صورت مالتی ترد اجرا میشه. کلا برنامه‌ای که از Application.ProcessMessage استفاده میکنه از لحاظ طراحی و برنامه نویسی ضعیف محسوب میشه.
برنامه شما اگر از ترد استفاده نکنه در main vcl thread اجرا خواهد شد. برای اینکه بتونه به پیغام‌های رسیده بدون بلاک کردن ترد اصلی برنامه بپردازه باید ترد جدیدی ایجاد کنید و گرنه همان مشکلی را خواهید داشت که الان دارید (بلاک شدن ترد اصلی و عدم توانایی پاسخگویی به تمامی اطلاعات رسیده).
جستجو کنید در همین بخش مقاله آموزشی در مورد ترد هست.

AlirezaBahredar
یک شنبه 27 آبان 1386, 10:15 صبح
anubis_ir میشه لطف کنی موضوع را بیشتر باز کنی....
اگه میشه یک مقایسه ای داشته باشید بین Application.ProcessMessage و Threadبنظر خودم کسیکه اشراف کامل روی این دو موضوع داشته باشه بهتر می تونه موضوع رو برای دوستان تشریح کنه.

A.Nemati
دوشنبه 28 آبان 1386, 09:52 صبح
Application.ProcessMessage با Thread متفاوت است. در Thread شما با توجه به اولویت آن، می‌خواهید که به موازات Proccessهای دیگر، کار شما نیز انجام شود اما در Application.ProcessMessage، برنامه شما، داخل یک حلقه، به تمامی Proccessهای موجود در صف Proccessها اجازه اجرا شدن می‌دهد تا زمانی که این صف خالی شود.
با توجه به این توضیحات، کار این دو با هم متفاوت است و کاری که من می‌خواهم انجام دهم دقیقا Application.ProcessMessage است.
آقای بحره‌دار عزیز (اگر اشتباه نکرده باشم)، من هنوز به نتیجه درستی نرسیده‌ام. البته شاید بتوان این کار را با نوعی Tread شبیه‌سازی کرد ولی به ایده کاملی نرسیده‌ام. هنوز مشغول جستجوی راه حل هستم و به محض پیدا کردن یک راه درست، حتما آن را در اینجا خواهم نوشت.

Touska
دوشنبه 28 آبان 1386, 14:19 عصر
بهترین راه حل همونی هست که آقای کشاورز فرمودند :

برای ساخت Thread هم قبلا برای کار در indy یک نمونه ساختم کار با Thread رو گذاشته بودم.

موفق باشید :)