PDA

View Full Version : خارج شدن از یک حلقه While با کلید Esc



edisoon
پنج شنبه 25 مهر 1387, 15:12 عصر
چگونه میشود با فشار دادن کلید Esc از یک حلقه Do While خارج شد؟
فرض کنید که در یک حلقه While قراره از 1 تا 1000000 شمرده بشه، در طی این پروسه میخوام کاری کنم که اگر کاربر کلید Esc رو زد پروسه شمارش متوقف بشه و از While خارج بشه. روش این کار چیست؟

mostafaaa
پنج شنبه 25 مهر 1387, 16:05 عصر
البته اگه thread اصلی برنامه رو توی یه حلقه طولانی یا بی نهایت بندازی معمولا برنامه هنگ میکنه و اجازه Ese زدن رو بهت نمیده ولی میتونی حلقه رو توی یه Thread دیگه انجام بدی . به این شکل

Dim MyThread As Threading.Thread
Dim StopLoop As Boolean
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MyThread = New Threading.Thread(AddressOf DoLoop)
StopLoop = False
MyThread.Start()
End Sub
Sub DoLoop()
Dim Count As Double = Nothing
Do
Count += 1
If StopLoop = True Then Exit Do
Loop
MsgBox("Worked")
End Sub
Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
If keyData = Keys.Escape Then StopLoop = True
Return MyBase.ProcessCmdKey(msg, keyData)
End Function

edisoon
پنج شنبه 25 مهر 1387, 16:31 عصر
ممنونم ولی اگه بخوام همین کار رو توی Thread اصلی برنامه انجام بدم باید چی کار کنم؟
البته اگه روش ساده تری وجود داره بگید ممنونم. من فقط میخوام توی یک حلقه اجازه زدن کلید به کاربر رو بدم و بفهمم که چه کلیدی رو زده. مثلا اگه Esc زد از حلقه بیام بیرون و این کار رو توی یک Thread دیگه انجام ندم

mostafaaa
پنج شنبه 25 مهر 1387, 20:38 عصر
هیچ فرقی نمی کنه شما فقط به جای اینکه یه Thred بسازی و اونو Start کنی مستقیم میتونی بری سراغ سابروتین DoLoop.

edisoon
پنج شنبه 25 مهر 1387, 22:45 عصر
تست کردم ولی متاسفانه حلقه اجازه نمیده کلید خونده بشه.


Public Class Form1

Dim EscapeKeyPressed As Boolean = False

Private Sub BtnStartLoop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStartLoop.Click
ProgressBar1.Minimum = 0
ProgressBar1.Value = 0
ProgressBar1.Maximum = 100000

EscapeKeyPressed = False
Dim x As Integer = 0
Do While x < 100000 AndAlso EscapeKeyPressed = False
ProgressBar1.Value = ProgressBar1.Value + 1
x += 1
Loop
MsgBox("Finish...")
End Sub

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
If keyData = Keys.Escape Then EscapeKeyPressed = True
Return MyBase.ProcessCmdKey(msg, keyData)
End Function

End Class

حامد مصافی
پنج شنبه 25 مهر 1387, 22:52 عصر
قبل از خط Loop خط زیر را وارد کنید


application.doevents()

edisoon
پنج شنبه 25 مهر 1387, 23:07 عصر
این کار یه مشکل داره و اونم اینه که اگر کاربر دکمه Close مربوط به Form رو بزنه، فرم بسته میشه ولی Loop متوقف نمیشه و ادامه پیدا میکنه.