ماهو حل تعليق الفورم اثناء تنفيذ دوال التكرار - silverlord - 01-11-14
السلام عليكم ورحمة الله وبركاته
اخواني اخواتي المبرمجين عندي استفسار وهو كيف اعمل Stop او Break لأي دالة تكرارية اثناء تنفيذ الدالة
يعني بمجرد الضغط على زر Stop في الفورم يتم ايقاف الدالة التكرارية فوراً (في طريقة شاهدتها قبل فترة في احد الدروس وهي عن طريق Handles ياليت اللي يعرفها يضعها )
طبعاً انا عملت محاولة بسيطة مني وهي توليد ارقام من 1 الى 1000000 وعرض الارقام في ListBox
وعملت زر
Button1 =Start
و زر اخر
Button2 =Stop
المشكلة التي لاحظتها وهي بمجرد الضغط على زر Start البرنامج يعلق ولا استطيع الضغط على اي زر حتى ينتهي من تنفيذ الدالة التكرارية
وما اريده عند الضعط على زر Stop يعمل ايقاف فوري لدالة التكرارية
عموما هذا كود ومحاولة بسيطة مني ولم اختبر زر Stop لأن البرنامج يعلق ولا استطيع الضغط على الزر
كود :
Public Class Form1
Dim off As Boolean = True
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
For index As Double = 1 To 1000000 Step 1
ListBox1.Items.Add(index)
If off = False Then
Exit For
End If
Next
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
off = False
End Sub
End Class
RE: ماهو حل تعليق الفورم اثناء تنفيذ دوال التكرار - سعود - 01-11-14
استخدم مسار مستقل للعد multithreading
لو تريد الكيفية اكتب رد
كود :
Public Class Form1
Dim i As Integer = 0
Private Sub l(ByVal t As String)
If lbl.InvokeRequired Then
lbl.Invoke(New Action(Of String)(AddressOf l), t)
Else
lbl.Text = t
End If
End Sub
Private Sub pp(ByVal t As Integer)
If lbl.InvokeRequired Then
p.Invoke(New Action(Of Integer)(AddressOf pp), t)
Else
p.Value = t
End If
End Sub
Private Sub bb_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bb.DoWork
Do Until i = 1000 Or bb.CancellationPending = True
i += 1
Threading.Thread.Sleep(500)
l(i)
bb.ReportProgress(i)
Loop
End Sub
Private Sub btnstart_Click(sender As Object, e As EventArgs) Handles btnstart.Click
If bb.IsBusy = False Then
bb.RunWorkerAsync()
End If
End Sub
Private Sub bb_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bb.ProgressChanged
pp(e.ProgressPercentage)
End Sub
Private Sub btnstop_Click(sender As Object, e As EventArgs) Handles btnstop.Click
bb.CancelAsync()
End Sub
End Class
فيه تعديل بسيط في الكلاس وهو تحديد قيمة اعلى لـ progressbar
كود :
Public Class Form1
Dim i As Integer = 0
Dim ii As Integer = 1000
Private Sub l(ByVal t As String)
If lbl.InvokeRequired Then
lbl.Invoke(New Action(Of String)(AddressOf l), t)
Else
lbl.Text = t
End If
End Sub
Private Sub pp(ByVal t As Integer)
If lbl.InvokeRequired Then
p.Invoke(New Action(Of Integer)(AddressOf pp), t)
Else
p.Value = t
End If
End Sub
Private Sub bb_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bb.DoWork
Do Until i = ii Or bb.CancellationPending = True
i += 1
Threading.Thread.Sleep(500)
l(i)
bb.ReportProgress(i)
Loop
End Sub
Private Sub btnstart_Click(sender As Object, e As EventArgs) Handles btnstart.Click
If bb.IsBusy = False Then
p.Maximum = ii
bb.RunWorkerAsync()
End If
End Sub
Private Sub bb_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bb.ProgressChanged
pp(e.ProgressPercentage)
End Sub
Private Sub btnstop_Click(sender As Object, e As EventArgs) Handles btnstop.Click
bb.CancelAsync()
End Sub
End Class
RE: ماهو حل تعليق الفورم اثناء تنفيذ دوال التكرار - silverlord - 03-11-14
الله يعطيك العافية اخوي سعود
تم حل المشكلة
RE: ماهو حل تعليق الفورم اثناء تنفيذ دوال التكرار - سعود - 04-11-14
كود :
Private Sub pp(ByVal t As Integer)
If lbl.InvokeRequired Then
p.Invoke(New Action(Of Integer)(AddressOf pp), t)
Else
p.Value = t
End If
End Sub
فيه خطا بسيط في هذا الروتين لم افطن له وهو واضح
|