نمایش نتایج 1 تا 14 از 14

نام تاپیک: دستور DoEvents

  1. #1

    دستور DoEvents

    دستور DoEvents چي كار مي كنه؟
    مرسي

  2. #2

    نقل قول: دستور DoEvents

    سلام
    کار این دستور این است که وقتی نرم افزار عملیات سنگینی را در حال انجام میباشد به سیستم اجازهی انجام دیگر عملیات را هم میدهد
    به طور کل این دستور جلوی هنگ کردن سیستم در مواقع اجرای عملیات سنگین رو میگیره

  3. #3
    کاربر دائمی آواتار ماهان مقدم
    تاریخ عضویت
    خرداد 1387
    محل زندگی
    خونه
    پست
    134

    نقل قول: دستور DoEvents

    عزیز جان این دستور توجه کرده باشی همیشه بعد از حلقه ها دیده میشه. اگه توی توسیه های ماکروسافت دیده باشید گفته که چون وی بی توی اجراء حلقه ها مشکل داره منظورم اینه که توی اجرا حلقه کم میاره و سیستم هنگ میکنه و بخاطر همین این دستور گذاشته میشه که از هنگ کردن برنامه جلو گیری بشه مثل دوستمون که بالا گفتن.

  4. #4

    نقل قول: دستور DoEvents

    دوست عزیز ربطی به ایراد وی بی در حلقه نداره

    کلا ساختار حلقه به این شکل می باشد

    Doevents جاهای دیگر هم کاربرد داره ولی مثل شمشیر دولبه می مونه



    ASP.NET MVC / Entity Framework / Design Pattern
    XCode Objective-C IOS Developer



  5. #5

    نقل قول: دستور DoEvents

    نقل قول نوشته شده توسط 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 هم مشکلاتی رو بهمراه داره، که عموما برنامه نویسها از اون بی اطلاع هستن...

    موفق باشید.

  6. #6

    نقل قول: دستور DoEvents

    از توصیحات کامل شما سپاسگذارم ، ولی ای کاش در مورد معایبش هم توضیحی میفرمودید.

  7. #7

    نقل قول: دستور DoEvents

    نقل قول نوشته شده توسط reza_mn مشاهده تاپیک
    از توصیحات کامل شما سپاسگذارم ، ولی ای کاش در مورد معایبش هم توضیحی میفرمودید.
    سلام.
    ایرادهایی که ممکنه بواسطه استفاده از این متود پیش بیاد، واقعا زیاد و متنوع هستش. برای مشاهده بخشی از این ایرادها، میتونید به این وبلاگ رجوع کنید. برخی ایرادها هم در این وبلاگ پست شده.

    در یک جمله، استفاده از این متود ممکنه شرایطی رو در runtime بوجود بیاره که شما آمادگی Handle کردن اونو از قبل نداشتید! بنابراین توصیه من عدم استفاده از این متود در هر شرایطی هستش.

  8. #8
    کاربر دائمی آواتار scarce
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    gifdoni.com
    پست
    330

    نقل قول: دستور DoEvents

    معایبش که بیشتر وجود داره اینه که شما بخواهید در یک زمان خاص یک داده ای رو پردازش کنید اگه قبل پردازش داده از این دستور استفاده کنید زمان کمی دیرتر میشه در نتیجه از ان زمان کمی وقفه ایجاد میشه که نمی تونه عمل پردازش رو انجام بده

  9. #9
    VIP آواتار xxxxx_xxxxx
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    X place
    سن
    35
    پست
    4,768

    نقل قول: دستور DoEvents

    به نظر من بجاي استفاده از DoEvents از MultiThreading استفاده بشه بهتره.
    الگوریتم هایی که تاریخچه خود را فراموش می کنند، محکوم به تکرار آن هستند.

  10. #10
    کاربر دائمی آواتار butterfly8528
    تاریخ عضویت
    شهریور 1387
    محل زندگی
    CLR
    پست
    896

    نقل قول: دستور DoEvents

    به نظر من بجاي استفاده از DoEvents از MultiThreading استفاده بشه بهتره.
    تا حالا MultiThread رو تو vb6 پیاده کردی ؟؟؟؟

  11. #11
    VIP آواتار xxxxx_xxxxx
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    X place
    سن
    35
    پست
    4,768

    نقل قول: دستور DoEvents

    آره، اما به سختی!

    تو همین سایت فکر کنم یه آموزش فارسی وجود داشته باشه.
    اما اگر دست به کار شدید، حواستون باشه که برنامه رو قبل از اجرا باید ذخیره کنید. چون اگر تردی که ایجاد می کنید به درستی مدیریت نشده باشه کل برنامه همراه با VB می پره

    کار با تردها در VB بسیار دشوار هست در حالی که در .NET به راحتی پیاده سازی میشه.

    در مورد پست قبلیم که مربوط به شش ماه پیش هست اضافه کنم که همیشه این طور نیست مگر این که واقعاً مجبور باشیم تا از MultiThreading استفاده کنیم. (با توجه به توضیحاتی که آقای mehdi6755 دادند).
    الگوریتم هایی که تاریخچه خود را فراموش می کنند، محکوم به تکرار آن هستند.

  12. #12
    کاربر دائمی آواتار butterfly8528
    تاریخ عضویت
    شهریور 1387
    محل زندگی
    CLR
    پست
    896

    نقل قول: دستور DoEvents

    واقعا اگه ترد رو تو ویبی 6 پیاده شه عال میشه .

    مقاله رو هم دارم ولی . . .

    میشه نمونه کارتون رو بگزارید ؟

  13. #13
    VIP آواتار xxxxx_xxxxx
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    X place
    سن
    35
    پست
    4,768

    نقل قول: دستور DoEvents

    میشه نمونه کارتون رو بگزارید ؟
    همونطور که تو پست قبلی گفتم تو یکی از اجراهای برنامه همه چی پرید و بعدش هم حوصله دوباره کاری نداشتم.
    این قضیه مربوط به پارسال هست و متأسفانه نمونه کد آماده هم ندارم.
    الگوریتم هایی که تاریخچه خود را فراموش می کنند، محکوم به تکرار آن هستند.

  14. #14

    نقل قول: دستور DoEvents

    نقل قول نوشته شده توسط xxxxx_xxxxx مشاهده تاپیک
    همونطور که تو پست قبلی گفتم تو یکی از اجراهای برنامه همه چی پرید و بعدش هم حوصله دوباره کاری نداشتم.
    این قضیه مربوط به پارسال هست و متأسفانه نمونه کد آماده هم ندارم.
    کرش شدن برنامه در این حالت در vb6 کاملا توجیه پذیره و فکر کنم بیشتر به خاطر runtimeهایش هست.

    برنامه نویسی در این حالت مستلزم داشتن دانش کافی در زمینه سیستم عامل و ترد هاست.
    پیشنهاد بنده این است که از مالتی تردینک در vb6 استفاده نکنین چون داده ها و برنامه در خطر خواهد بود.vb6 قدرت کافی برای کشیدن مالتی ترد را ندارد.

    اما شدنیه بگردین پیدا میشه ( تو گوگل یا جاهای دیکه مثال های زیادی هست)

    موفق باشید.

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •