PDA

View Full Version : سوال: DoEvents را در چه مواقعی به کار می بریم؟



parand60
یک شنبه 21 اسفند 1390, 14:38 عصر
با سلام و خسته نباشید خدمت همه دوستان !
DoEvents را در چه مواقعی به کار می بریم؟
ممنون

سید حمید حق پرست
یک شنبه 21 اسفند 1390, 15:01 عصر
سلام

این تابع برای اینه که ما بفهمیم الان برنامه داره چی کار می کنه. می گید یعنی چی؟

خب وقتی ما یه برنامه مثل زیر بنویسیم:

مثال: برنامه ای بنویسید که سه کادر متن داشته باشه با یه دکمه، وقتی روی دکمه کلیک کنیم از 1 تا 20000 به ترتیب داخل کادر متن1 و داخل کادر متن2 مقدار داخل کادر متن1 به اضافه ی 1 و داخل کادر متن3 مجموع کادر متن1 و 2 به همراه مقدار قبلی کادر متن3

اگه به هر کسی اینو بگی کد پایین رو می نویسه:

For i = 1 To 20000
Text1.Text = i
Text2.Text = i + 1
Text3.Text = Val(Text3.Text) + (Val(Text1.Text) + Val(Text2.Text))
Next

البته این کد هیچ گونه اشکالی نداره ولی اگه اجراش کنید می بینید که فرم 6-7 ثانیه قفل می کنه و ما نمی فهمیم که چی شده! حالا فکرشو کنید به جای جمع بخواییم ضرب کنیم و به جای 20000 از 200000 استفاده کنیم چی می شه؟. در این زمان (تا زمانی که از Next خارج نشده برنامه هنگ می مونه) برنامه داره کدهای داخل For رو اجرا می کنه.

حالا از تابع DoEvents کجا استفاده کنیم و کاراییش چیه؟

این تابه رو قبل از دستور Next می زاریم تا برنامه هر سری که کد اجرا می شه اونو به ما (همون کاربرمون) نشون بده. این کار باعث می شه که برنامه اصلا هنگ نکنه! البته برنامه سرعتش میاد پایین ولی بهتر از قبلیه هستش چون برنامه هنگ نمی کنه!

اینم کد بهمراه تابع مورد نظرمون:

For i = 1 To 20000
Text1.Text = i
Text2.Text = i + 1
Text3.Text = Val(Text3.Text) + (Val(Text1.Text) + Val(Text2.Text))
DoEvents
Next
هر موقع برنامه به این تابع برسه مراحل رو نشون می ده! حالا تکه کد1 رو با تکه کد2 مقایسه کنید (داخل وی بی) ببینید فرقشون چیه؟

موفق باشی


یا علی (ع)

ASedJavad
یک شنبه 21 اسفند 1390, 16:12 عصر
سلام
تابع DoEvents به طور کلي وقتي بکار ميره که ميخوايم بر اي يک لحظه برنامه، اجراي دستورات رو متوقف کنه و به پيام هاي ويندوز گوش کنه.
که حالا اين پيام ميتونه فشرده شدن يه دکمه باشه، repaint شدن پنجره باشه، همون طور که آسيد حميد گفت نمايش متن تو تکست باکس باشه يا هر چيز ديگه.
يه نمونش رو سيد برات گفت. يه نمونه ديگش رو هم من برات ميگم.

فرض کن يه دکمه داري تو برنامت که دو حالت start و stop داره
حالا شما ميخواي وقتي دکمت رو حالت start هست، اگه فشرده شد، بره رو حالت stop و مثلا سابروتين x که مثلا شامل يه حلقه چند هزار تاييه رو اجرا کنه.

و ميخواي وقتي دکمه در حالت stop فشرده شد، برنامه اجراي اون سابروتين رو متوقف کنه.
طبيعتا برا اينکار بايد تو حلقت يه شرط بذاري که مثلا اگه دکممون فشرده شد، از سابروتين بيا بيرون.
حالا شما مياي برنامه رو اجرا ميکنه و رو دکمه Start کليک ميکني. سابروتين x شروع به کار ميکنه. اما ديگه نميتوني اون رو متوقف کني.
چرا؟
چون وي بي تا وقتي سابروتين x به پايان نرسه، به ساير پيام هاي ويندوز (که در اينجا فشرده شدن دکمه در حالت stop هست) توجه نميکنه، و تا پايان اجراي سابروتين متوجه فشرده شدن دکمه نميشه.

برا حل اين مشکل مياي تو حلقه درون سابروتينت يه دستور doevents اضافه ميکني.
به اين ترتيب وي بي هر بار که ميخواد مرحله بعدي حلقه رو اجرا کنه، اول يه بررسي ميکنه ببينه پيام جديدي از ويندوز نداشته باشه بعد مرحله يعدي حلقه رو اجرا ميکنه.

mehdi.mousavi
یک شنبه 21 اسفند 1390, 16:29 عصر
DoEvents را در چه مواقعی به کار می بریم؟

هیچوقت. :) در هر حال، من قبلا در این مورد اینجا (http://barnamenevis.org/showthread.php?152798-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-DoEvents&p=697754#post697754) توضیح داده ام. هر وقت حس کردید که نیاز به استفاده از DoEvents دارید، بدونید که میشه بدون استفاده از اون و با استفاده از یک Timer یا یک UI Thread همون کار رو بدرستی و بدون درگیر شدن با Side Effect هایی که قبلا در دیگر پست هام بهش اشاره کرده بودم، اون کارو انجام داد.

موفق باشید.