تقييم الموضوع :
  • 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 ك ب / التحميلات : 12)
أستودعكم الله الذي لا تضيع ودائعه أرجو ان تجدوا بمشاركاتي ما يجعلكم تدعون لي بخير ان تحتم غيابي.
الرد }}}}
تم الشكر بواسطة: 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
أستودعكم الله الذي لا تضيع ودائعه أرجو ان تجدوا بمشاركاتي ما يجعلكم تدعون لي بخير ان تحتم غيابي.
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  تثبيت التاريخ علي الفورم ddemed 3 86 04-12-16, 05:45 PM
آخر رد: ddemed
  تغير تاريخ الفورم ddemed 0 42 01-12-16, 06:37 PM
آخر رد: ddemed
  تشغيل الفورم بتاريخ ddemed 3 77 01-12-16, 05:41 PM
آخر رد: ddemed
  [SQL] ماهو سبب هذا الخطأ بعد تثبيت SQL thevirus 2 62 30-11-16, 08:34 PM
آخر رد: ابو ليلى
  كيفيه تشغيل الفورم بالتاريخ الذي يحدده المستخدم ddemed 5 129 23-11-16, 10:12 PM
آخر رد: السرور
  ماهو كود انقاص كميه المباعه من الكميه الموجوده معتز الجازوي 1 58 22-11-16, 09:16 PM
آخر رد: السرور
  [سؤال] مشكلة في إعادة تنفيذ البرنامج wael khlak 1 52 21-11-16, 11:48 PM
آخر رد: السرور
  استدعاء ملف به تاريخ للبرنامج وتشغيل الفورم به ddemed 8 152 11-11-16, 10:25 PM
آخر رد: bidaya
  [سؤال] لعدم التكرار في naden 2 78 10-11-16, 03:15 AM
آخر رد: naden
  التعديل الذي أقوم به في الفورم لا يظهر عند عمل RUN نسيم 8 202 07-11-16, 01:14 PM
آخر رد: zinom

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


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