PDA

View Full Version : سوال: وقفه در انجام هر لوپ



Eminece333
شنبه 10 اسفند 1392, 15:49 عصر
سلام
من چطور می تونم تو کد زیر بعد از قسمت messagebox.show یک وقفه به مدت یک ثانیه داشته باشم
نمیخوام از sleep استفاده کنم چون نباید برنامم جالت هنگ یا قفل داشته باشه. چون از ویژوال بیسیک 2010 هم استفاده می کنم نمی تونم از متود های async استفاده کنم
خواستم بدونم به جز این روش ها راه های دیگه هم هست مثلا با تایمر هم میشه؟

{"Dim msg() As String = {"a", "b", "c", "e

For Each item In msg
(MessageBox.Show(item
wait for a second'
Next

Morteza-76
شنبه 10 اسفند 1392, 15:56 عصر
بله میتونید از تایمر استفاده کنید یک لیبل روی فرم قرار دهید و خاصیت visible رو در حالت false قرار دهید و مقدار اون لیبل رو بزارید 0 و یک تایمر به برنامه اضافه کنید و خاصیت enabled رو برابر false و interval اون رو هم روی هزار بگذارید و برای تایمر کد های زیر را بنویسید

Label1.Text = Label1.Text + 1

در این صورت هر یک ثانیه یک بار به لیبل شما یکی اضافه میکند و شما هم توی دستورات 'wait for a second بزارید اگر لیبل شما برابر یک شد دستورات شما انجام بشه

Alirezanet
شنبه 10 اسفند 1392, 16:01 عصر
سلام
اگر از دات نت 4.5 بتونید استفاده کنید از کلاسهای Task میتونید استفاده کنید ... و برای وقفه انداختن بین کدهاتون متد Delay دقیقا مشابه Sleep استفاده میشه با این تفاوت که برنامه قفل نمیشه ...
Task.Delay(5000)

به روش های دیگه هم میتونید این کار رو انجام بدید به طور مثال استفاده از Thread مجزا یا BackgroundWorker و استفاده از Timer همون طور که دوستمون اشاره کردند(هرچند من موافق استفاده از Label نیستم ! با یک متغیر ساده در سطح فرم خیلی راحت میشه این کار رو کرد) ....
نمونه کد زیاد هست در این زمینه با یک سرچ کوچیک به جواب میرسید.

موفق باشید

Eminece333
شنبه 10 اسفند 1392, 16:25 عصر
مرسی از پاسختون.
این روشی که گفتین فقط برای یک دور از لوپ هست و اگه هم بخوایم با کمی تغییر بتوننیم برای ادامه لوپ استفاده کنیم ممکنه که در اون لحظه لیبل ما بهش یک اضافه نشده باشه(تایمر تیک نخورده باشه) که لوپ از if statement ما میگذره و میره لوپ بعدی را انجام میده

Alirezanet
شنبه 10 اسفند 1392, 16:43 عصر
نمونه استفاده از thread :


Dim thrd As New Threading.Thread(Sub()
Dim msg() As String = {"a", "b", "c", "e"}
For Each item In msg
Threading.Thread.Sleep(5000) 'wait for a second'
MsgBox(item)
Next
End Sub)
thrd.Start()



کدتون رو به این صورت بازنویسی کنید مشکلش حل میشه ....

Eminece333
شنبه 10 اسفند 1392, 17:16 عصر
مچکرم از جوابتون ولی این روشی که گفتید اگه کاربر برنامه رو ببنده باز هم item رو نشون میده ولی در کل من نمی خوام ار sleep استفاده کنم چون اگه بخوام یک شی رو حرکت بدم توی خود فرم از thread نمی تونم استفاده کنم

Alirezanet
شنبه 10 اسفند 1392, 17:48 عصر
میتونید Thread رو هنگام خروج برنامه متوقف کنید... اگر مشکل این باشه ...
thrd.Stop()
ولی اگر کلا از یک thread دیگه نمیخواید استفاده کنید مثله این میمونه که شما بخواید برید سرکار ولی کار نکنید !! نمیشه Thread جاری برنامه رو نگه داشت که به طور مثال طی یک زمانی کدی رو اجرا کنه و برنامه هم مشکلی براش پیش نیاد !

البته اگه روش کدنویسیتون رو تغییر بدید میشه با یک تایمر این مشکل رو حل کرد ...
به طور مثال بجای استفاده از حلقه برای پیمایش بیاید و در هر تیک (Tick) از یک تایمر از طریق MsgBox یکی از مقادیر رو نشون بدید ... کافیه Timer رو در سطح کلاس فرمتون ایجاد کنید تا بشه از هرجا که خواستید مدیریتش کرد

Eminece333
شنبه 10 اسفند 1392, 17:58 عصر
مرسی بالاخره با این روش مشکلم حل شد. استفاده از تایمر بجایه حلقه ی for. مچکرم