تقييم الموضوع :
  • 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 ك ب / التحميلات : 26)
كل مااعرفه في البرمجة تجدونه هنا
الرد }}}}
تم الشكر بواسطة: silverlord , kslawy
#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
كل مااعرفه في البرمجة تجدونه هنا
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  مشكلة الفورم الشفاف محمود صالح 5 171 اليوم, 12:47 AM
آخر رد: Fantastico
  [VB.NET] مشكلة اثناء تنفيذ المشروع ظاهر علي 1 46 15-09-17, 01:28 AM
آخر رد: أبو نوره
Big Grin [كود] شباب طريقة لإظهار الادوات بشكل شبه مخفى وليس الفورم badr.kamel 3 133 14-09-17, 05:07 AM
آخر رد: Mohamad Anan
  اريد كود لتحقق ان كان الفورم مفتوح ام لا The Light Fire 2 83 11-09-17, 06:57 PM
آخر رد: The Light Fire
  الغاء تنفيذ الادخال عن طريق inputbox mo93 5 165 03-09-17, 01:38 AM
آخر رد: سعود
  ايه فايدة التقاير لما ممكن اطبع الفورم ؟؟؟ نبيل كونكت 1 86 22-08-17, 11:59 AM
آخر رد: حريف برمجة
  مشكلة في عرض الفورم وتضهر هذه الرساله eng_yuyu 1 142 14-07-17, 08:56 PM
آخر رد: سعود
  سؤال فى صورة الفورم الرئيسى salah mansour 7 269 05-07-17, 08:54 PM
آخر رد: salah mansour
  البحث فوق الفورم abdulla2 0 112 27-06-17, 02:54 AM
آخر رد: abdulla2
  تنفيذ كود قبل فتح البرنامج ddemed 17 433 24-06-17, 06:52 PM
آخر رد: silverlight

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


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