View Full Version : دستور DoEvents
aminkk
یک شنبه 09 فروردین 1388, 23:15 عصر
دستور DoEvents چي كار مي كنه؟
مرسي
sina_saravi1
دوشنبه 10 فروردین 1388, 10:42 صبح
سلام
کار این دستور این است که وقتی نرم افزار عملیات سنگینی را در حال انجام میباشد به سیستم اجازهی انجام دیگر عملیات را هم میدهد
به طور کل این دستور جلوی هنگ کردن سیستم در مواقع اجرای عملیات سنگین رو میگیره
ماهان مقدم
دوشنبه 10 فروردین 1388, 11:23 صبح
عزیز جان این دستور توجه کرده باشی همیشه بعد از حلقه ها دیده میشه. اگه توی توسیه های ماکروسافت دیده باشید گفته که چون وی بی توی اجراء حلقه ها مشکل داره منظورم اینه که توی اجرا حلقه کم میاره و سیستم هنگ میکنه و بخاطر همین این دستور گذاشته میشه که از هنگ کردن برنامه جلو گیری بشه مثل دوستمون که بالا گفتن.
mpmsoft
دوشنبه 10 فروردین 1388, 11:52 صبح
دوست عزیز ربطی به ایراد وی بی در حلقه نداره
کلا ساختار حلقه به این شکل می باشد
Doevents جاهای دیگر هم کاربرد داره ولی مثل شمشیر دولبه می مونه
mehdi.mousavi
دوشنبه 10 فروردین 1388, 12:57 عصر
دستور 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 هم مشکلاتی رو بهمراه داره، که عموما برنامه نویسها از اون بی اطلاع هستن...
موفق باشید.
reza_mn
دوشنبه 10 فروردین 1388, 13:36 عصر
از توصیحات کامل شما سپاسگذارم ، ولی ای کاش در مورد معایبش هم توضیحی میفرمودید.
mehdi.mousavi
دوشنبه 10 فروردین 1388, 15:02 عصر
از توصیحات کامل شما سپاسگذارم ، ولی ای کاش در مورد معایبش هم توضیحی میفرمودید.
سلام.
ایرادهایی که ممکنه بواسطه استفاده از این متود پیش بیاد، واقعا زیاد و متنوع هستش. برای مشاهده بخشی از این ایرادها، میتونید به این وبلاگ رجوع کنید. (http://blogs.msdn.com/jfoscoding/archive/2005/08/06/448560.aspx) برخی ایرادها هم در این وبلاگ (http://blog.somecreativity.com/2007/11/19/a-look-at-doevents/)پست شده.
در یک جمله، استفاده از این متود ممکنه شرایطی رو در runtime بوجود بیاره که شما آمادگی Handle کردن اونو از قبل نداشتید! بنابراین توصیه من عدم استفاده از این متود در هر شرایطی هستش.
scarce
دوشنبه 17 فروردین 1388, 18:01 عصر
معایبش که بیشتر وجود داره اینه که شما بخواهید در یک زمان خاص یک داده ای رو پردازش کنید اگه قبل پردازش داده از این دستور استفاده کنید زمان کمی دیرتر میشه در نتیجه از ان زمان کمی وقفه ایجاد میشه که نمی تونه عمل پردازش رو انجام بده
xxxxx_xxxxx
چهارشنبه 19 فروردین 1388, 06:54 صبح
به نظر من بجاي استفاده از DoEvents از MultiThreading استفاده بشه بهتره.
butterfly8528
یک شنبه 22 شهریور 1388, 00:39 صبح
به نظر من بجاي استفاده از DoEvents از MultiThreading استفاده بشه بهتره.
تا حالا MultiThread رو تو vb6 پیاده کردی ؟؟؟؟ :متفکر:
xxxxx_xxxxx
یک شنبه 22 شهریور 1388, 01:06 صبح
آره، اما به سختی!
تو همین سایت فکر کنم یه آموزش فارسی وجود داشته باشه.
اما اگر دست به کار شدید، حواستون باشه که برنامه رو قبل از اجرا باید ذخیره کنید. چون اگر تردی که ایجاد می کنید به درستی مدیریت نشده باشه کل برنامه همراه با VB می پره :گیج:
کار با تردها در VB بسیار دشوار هست در حالی که در .NET به راحتی پیاده سازی میشه.
در مورد پست قبلیم که مربوط به شش ماه پیش هست اضافه کنم که همیشه این طور نیست مگر این که واقعاً مجبور باشیم تا از MultiThreading استفاده کنیم. (با توجه به توضیحاتی که آقای mehdi6755 (http://barnamenevis.org/forum/member.php?u=41233) دادند).
butterfly8528
یک شنبه 22 شهریور 1388, 02:36 صبح
واقعا اگه ترد رو تو ویبی 6 پیاده شه عال میشه .
مقاله رو هم دارم ولی . . .
میشه نمونه کارتون رو بگزارید ؟
xxxxx_xxxxx
یک شنبه 22 شهریور 1388, 05:47 صبح
میشه نمونه کارتون رو بگزارید ؟
همونطور که تو پست قبلی گفتم تو یکی از اجراهای برنامه همه چی پرید و بعدش هم حوصله دوباره کاری نداشتم.
این قضیه مربوط به پارسال هست و متأسفانه نمونه کد آماده هم ندارم.
حمید محمودی
سه شنبه 24 شهریور 1388, 16:26 عصر
همونطور که تو پست قبلی گفتم تو یکی از اجراهای برنامه همه چی پرید و بعدش هم حوصله دوباره کاری نداشتم.
این قضیه مربوط به پارسال هست و متأسفانه نمونه کد آماده هم ندارم.
کرش شدن برنامه در این حالت در vb6 کاملا توجیه پذیره و فکر کنم بیشتر به خاطر runtimeهایش هست.
برنامه نویسی در این حالت مستلزم داشتن دانش کافی در زمینه سیستم عامل و ترد هاست.
پیشنهاد بنده این است که از مالتی تردینک در vb6 استفاده نکنین چون داده ها و برنامه در خطر خواهد بود.vb6 قدرت کافی برای کشیدن مالتی ترد را ندارد.
اما شدنیه بگردین پیدا میشه ( تو گوگل یا جاهای دیکه مثال های زیادی هست)
موفق باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.