نقل قول نوشته شده توسط aminkk مشاهده تاپیک
دستور DoEvents چي كار مي كنه؟ مرسي
پاسخ کوتاه: پیامهای موجود در صف پیامها رو پردازش میکنه!

پاسخ کامل:
برای دونستن این مطلب، باید ابتدا بدونید که ویندوز چطور کار میکنه. در ویندوز و برای ایجاد یک پنجره، ابتدا باید یک Window Class ثبت کنیم. این Window Class حاوی اطلاعات بنیادی مورد نیاز برای ایجاد یک پنجره هستش. این اطلاعات شامل نام کلاس، Style یک کلاس، App. Instance مربوطه و ... هستش. اما مهمترین چیزی که در هنگام ثبت کلاس تعیین میکنیم، یک تابع هستش که بهش میگن Window Procedure. این تابع وظیفه پردازش پیامهایی رو داره، که سیستم عامل به اون ارسال میکنه. بعبارت دیگه، وقتی شما (بعنوان نمونه) Mouse رو روی یک Window تکون می دید، پیام WM_MOUSEMOVE به این تابع ارسال میشه و شما در این تابع، متوجه خواهید شد که Mouse روی پنجره شما (پنجره ای که ثبت کردید)، تکون خورده. هر پیام حاوی جزییات دیگه ای میتونه باشه، که بهمراه اون پیام، به Window Procedure ارسال میشه (مثلا مختصات Mouse و ...).

پس فهمیدیم که برای ایجاد یک ویندو در محیط ویندوز، ابتدا باید یک Window Class ثبت کنیم. در قدم دوم، باید یک Window ایجاد کنیم. برای ایجاد یک window هم، باید اطلاعات خاصی رو در اختیار سیستم عامل قرار بدیم، اینکه Title این ویندو چی هستش، جایگاهش رو صفحه کجاست و مهمتر از همه، نام Window Class ای که در مرحله اول ثبت کرده بودیم. بدین ترتیب، ویندو ایجاد میشه.

حالا باید تعیین کنیم که این ویندو، میخواهیم چطوری روی صفحه دیده بشه، Minimized، Maximized، Hidden یا ... وقتی همه این کارها رو انجام دادیم، حالا باید به سیستم عامل بفهمونیم که ما دوست داریم، منتظر پیامهایی که به سمت پنجره تازه ایجاد شده ما میاد، باشیم. چطور اینکارو می کنیم؟

اینجا یک Loop درست می کنیم، و میگیم تا وقتی پیام "بسته شدن پنجره" یا "خروج از برنامه" برای پنجره ما نیومده، پیامهای موجود در "صف پیامهای منو" پردازش کن. بعبارت دیگه، وقتی (بعنوان نمونه)، Mouse روی پنجره من تکون خورد، پیام WM_MOUSEMOVE رو از صف در بیار، و Window Procedure منو با پیام مزبور فراخوانی کن تا من بتونم توی Window Procedure خودم، کاری رو که دوست دارم بکنم.

حالا فرض کنید این پیام به دست Window Procedure من رسید... من توی این تابع دوست دارم وقتی Mouse تکون خورد، Text خاصی رو روی صفحه تغییر بدم. وقتی کد مورد نظرم رو در Window Procedure (به این منطور) نوشتم، تا وقتی از Window Procedure خارج نشم، اون تغییر Text اعمال نمیشه. چون در واقع تغییر دادن Text باعث شده که پیام جدیدی در صف پیامها قرار بگیره و در این صف، تا وقتی پیام قبلی پردازشش تموم نشده، نوبت به پردازش پیام جدید نخواهد رسید. حالا میخوام به زور، سیستم رو مجبور کنم که قبل از خروج از Window Procedure من و قبل از تموم شدن پردازش پیام WM_MOUSEMOVE، ویندوز پیام بعدی موجود در صفحه رو پردازش کنه. برای اینکار، از DoEvents استفاده میکنم. این تابع باعث میشه تا کلیه، تکرار می کنم، کلیه پیامهای موجود در صف در لحظه فراخوانی پردازش بشه. این کار میتونه یه خوبی هایی داشته باشه، و یه بدی هایی. اما چون بدیهاش، خیلی بیشتر از خوبیهاش هست، بهتون توصیه می کنم هرگز از این تابع استفاده نکنید!

چیزهایی که توضیح دادم، در محیط .NET همه پشت پرده رخ میده و شما از اون کاملا بی اطلاع هستید. استفاده از DoEvents هم مشکلاتی رو بهمراه داره، که عموما برنامه نویسها از اون بی اطلاع هستن...

موفق باشید.