PDA

View Full Version : تفاوت SendMessage با postMessage



1485159
شنبه 24 مرداد 1388, 16:19 عصر
تفاوت SendMessage با postMessage در چیست؟
میشه یکم توضیح بدین؟(زیر دیپلم)

Felony
شنبه 24 مرداد 1388, 18:04 عصر
وقتي با استفاده از تابع SendMessage پيامي ارسال مي كنيد ، تابع منتظر دريافت پيامي از طرف برنامه مقصد می ماند كه نشان ميدهد پيامش به درستي ارسال شده . مثل زماني كه شما sms اي ارسال مي كنيد و بعد منتظر پيام ارسالش مي مانيد . SendMessage هم به همين صورت هست. درواقع تضمين ميكنه تا زماني كه پيامش به درستي ارسال نشده باشه روال برنامه ادامه پيدا نميكنه. و گاهي موجب فریز شدن برنامه ميشه ، چون ممکنه برنامه ی مقصد نتونه به پیغام ارسال شده پاسخ بده .
ولي PostMessage بلافاصله پيام رو ارسال مي كنه و منتظر هيچ بازخوردي هم نميمونه و برنامه به کارعادی خودش ادامه میده .

etoshey
شنبه 24 مرداد 1388, 21:16 عصر
postmessage:پیام برنامه ی کاربردی را درون صف پردازش می گذارد.
sendmessage:پیام برنامه ی کاربردی را فورا اجرا می کند.

Saeed_m_Farid
شنبه 24 مرداد 1388, 22:45 عصر
postmessage:پیام برنامه ی کاربردی را درون صف پردازش می گذارد.
sendmessage:پیام برنامه ی کاربردی را فورا اجرا می کند.


اولاً اين برداشت غلط هست؛ هيچكدام از اين دوتا خودشون كاري انجام نميدن، فقط يه پيغام به Windows procedure ميفرستند تا اين پروسيجر، كار موردنظر رو انجام بده. ضمناً صحبت صف پردازش و اجراي فوري نيست. همونطوريكه SilverSoft گفتن : تفاوت اين دو تابع تو رفتن به خط بعدي كد و جلوگيري (PostMessage) يا عدم جلوگيري (SendMessage) از قفل شدن يا فريز شدن (freeze) برنامه است...



ثانياً اگه با فرض بالا گفته شما رو برداشت كنيم، دقيقاً برعكس اون چيزي كه شما گفتيد هست :



SendMessage vs PostMessage

Both require same parameters but there’s a slight difference. When a message is sent to a window with SendMessage, the window procedure is called and the calling program (or thread) waits for the message to be processed and replied back, and until then the calling program does not resume its processing. One thing is wrong with this approach however, that is if the program that is busy carrying out long instructions or a program that has been hung and hence no time to respond to the message will in turn hang your program too because your program will be waiting for a reply that may never arrive. The solution to this is to use PostMessage instead of SendMessage. PostMessage on the otherhand returns to the calling program immediately without waiting for the thread to process the message, hence saving your program from hanging. Which of them you have to use depends on your requirement.

etoshey
شنبه 24 مرداد 1388, 23:03 عصر
با send message روتین پاسخگویی به پیام فورا اجرا میشه و به همین دلیل برنامه فریز نمیشه.
ولی در post message در خواست درون صف پیام ها قرار می گیره .

Saeed_m_Farid
پنج شنبه 29 مرداد 1388, 01:21 صبح
با send message روتین پاسخگویی به پیام فورا اجرا میشه و به همین دلیل برنامه فریز نمیشه.
ولی در post message در خواست درون صف پیام ها قرار می گیره .
حرف مرد يكيه ديگه؟!
دوستان برنامه نويس، از اين به بعد ماست سياهه ...



SendMessage Function (http://msdn.microsoft.com/en-us/library/ms644950%28VS.85%29.aspx) : The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message




PostMessage Function (http://msdn.microsoft.com/en-us/library/ms644944%28VS.85%29.aspx): The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message


منبع : MSDN

vcldeveloper
پنج شنبه 29 مرداد 1388, 06:52 صبح
با send message روتین پاسخگویی به پیام فورا اجرا میشه و به همین دلیل برنامه فریز نمیشه.
با Send Message روتین پاسخگویی پیام که همان Window Procedure مربوطه هست، فراخوانی میشه، ولی این به معنای Freeze نشدن برنامه (Thread) ارسال کننده پیام نیست، چون در صورت استفاده از Send Message، اون Thread باید منتظر نتیجه اجرای تابع SendMessage بماند. مدت زمان انتظار بستگی به نوع پردازش حاصل از آن پیام دارد. پس احتمال Freeze شدن Thread ارسال کننده پیام، بیشتر هست.

با PostMessage، فارغ از اینکه پردازش پیام زمان بر هست، یا نه، بلافاصله بعد از قرار گرفتن پیام در صف پیام های Thread دریافت کننده پیام، کنترل اجرای دستور به اولین دستور بعد از PostMessage میره، پس ارسال کننده پیام نیازی به صبر کردن نداره.

SendMessage معمولا در مواردی استفاده میشه که پیام باید خارج از نوبت پردازش بشه، و نتیجه آن هم تا قبل از ادامه کار ارسال کننده پیام، مشخص بشه.
PostMessage معمولا زمانی استفاده میشه که ارسال کننده پیام فقط قصد اطلاع رسانی به دریافت کننده پیام را دارد، و پردازش کردن یا نکردن پیام یا زمان پردازش آن، برای ارسال کننده اهمیتی ندارد.