تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
ماهو حل تعليق الفورم اثناء تنفيذ دوال التكرار
#1
السلام عليكم ورحمة الله وبركاته

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


الملفات المرفقة
.zip   For_silverlord.zip (الحجم : 36.76 ك ب / التحميلات : 57)
الرد }}}
تم الشكر بواسطة: silverlord , kslawy , dasktop
#3
الله يعطيك العافية اخوي سعود

تم حل المشكلةSmile
الرد }}}
تم الشكر بواسطة: سعود
#4
كود :
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
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
Photo [VB.NET] مشكلة في شكل الفورم abuyazan 5 293 27-02-24, 09:38 PM
آخر رد: aljzazy
  ماهو حل هذا الخطأ في الكود melad2002 7 264 25-02-24, 12:25 AM
آخر رد: justforit
  كيفية تنفيذ امر عند التعليم على checkbox بالداتا جريد فيو heem1986 2 158 21-02-24, 01:37 AM
آخر رد: heem1986
  كيفية تنفيذ أمر عرض بيانات من فورم ثان مصمم هاوي 7 329 19-02-24, 12:28 AM
آخر رد: مصمم هاوي
  تنفيذ كود عند حدوث تغيرات فى أحد جداول قاعد بيانات sql heem1986 2 247 16-02-24, 06:37 AM
آخر رد: عبدالله الدوسري
  مشكلة عدم اكتمال تنفيذ بسبب فصل الشبكة او التيار الكهربائي اثناء النتفيذ تناسيم 3 1,840 05-02-24, 10:04 PM
آخر رد: 01AHMED
  [VB.NET] مشكلة ظهور textbox بعد حذفه من الفورم مبرمج صغير 1 1 219 27-01-24, 02:04 AM
آخر رد: مبرمج صغير 1
  مشكلة تعليق البرنامج في حال عدم وجود ماسح ضوئي متصل بالكمبيوتر صالح عبدالله 1 210 09-01-24, 10:51 PM
آخر رد: صالح عبدالله
  [VB.NET] تحويل التاريخ بين أداتين تايم بيكر في نفس الفورم محمد العموري 1 265 29-12-23, 10:44 PM
آخر رد: Kamil
  [VB.NET] ماهو اسم هذه الازرار ( + موجب و - سالب ) h2551996 1 249 19-12-23, 10:29 PM
آخر رد: justforit

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم