منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : ماهو حل تعليق الفورم اثناء تنفيذ دوال التكرار
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله وبركاته

اخواني اخواتي المبرمجين عندي استفسار وهو كيف اعمل 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
استخدم مسار مستقل للعد 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
الله يعطيك العافية اخوي سعود

تم حل المشكلةSmile
كود :
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
فيه خطا بسيط في هذا الروتين لم افطن له وهو واضحSmile