ورود

View Full Version : سوال: پیدا کردن دستور مشابه موجود در C Builder



majid zarei
شنبه 22 آبان 1389, 08:51 صبح
با سلام خدمت همه دوستان، در CBuilder دستور Application --> ProcessMessage (تا جایی که من فهمیدم) سبب می شود تا هنگامی که برنامه در حال انجام فعالیتی می باشد، برنامه به پیام های دیگر پاسخ دهد، به عنوان مثال اگر برنامه در حال انجام کاری باشد و اپراتور پنجره برنامه را Drag کند، مشکلی در روند Drag پیش نیاید.
حالا می خواستم ببینم دستورمشابه در VC++ چیه؟
با تشکر از همه دوستان:گیج:

mehdi.mousavi
سه شنبه 25 آبان 1389, 12:32 عصر
با سلام خدمت همه دوستان، در CBuilder دستور Application --> ProcessMessage (تا جایی که من فهمیدم) سبب می شود تا هنگامی که برنامه در حال انجام فعالیتی می باشد، برنامه به پیام های دیگر پاسخ دهد، به عنوان مثال اگر برنامه در حال انجام کاری باشد و اپراتور پنجره برنامه را Drag کند، مشکلی در روند Drag پیش نیاید.
حالا می خواستم ببینم دستورمشابه در VC++‎ چیه؟
با تشکر از همه دوستان:گیج:

سلام.
خدا رو شکر چنین تابعی در VC++/MFC وجود نداره، چون میتونه براحتی باعث برهم زدن ارگان یک نرم افزار بشه (بخصوص توسط افرادیکه از چگونگی عملکرد چنین توابعی بی اطلاع هستن). البته متاسفانه در .NET Framework تابعی تحت عنوان Application.DoEvents تعبیه شده که کارکرد مشابهی داره، یعنی پردازش پیامهای موجود در صف پیامها...

روش صحیح و قانونی انجام اینکار، استفاده از یک Worker Thread برای انجام کار زمان بر هستش، نه اینکه بخواهید به زور پیامهای موجود در Message Queue رو وادار به پردازش کنید (دلیل عدم استفاده از چنین متودهایی رو در نوشته هام بگردید، خواهید یافت. قبلا چند بار در این مورد در بخش C# توضیح داده ام).

اما با اینحال، اگر اصرار دارید کار مشابهی در MFC (یا Win32) انجام بدید، میتونید بدین شکل عمل کنید:

MSG msg;
while(PeekMessage(&msg, theApp.m_pMainWnd->m_hWnd, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}


اینجا، من ابتدا با PeekMessage پیام بعدی ای که در صف هستش رو در میارم (و البته از صف توسط پارامتر آخر، حذف می کنم)، سپس پیام رو ترجمه کرده و Dispatch اش می کنم. اما بازهم بهتون توصیه میکنم همواره کار رو اصولی انجام بدید تا از Side Effect های بوجود اومده در امان باشید.

موفق باشید.