2016-08-27 2 views
0

У меня есть этот цикл, который открывает случайные файлы и последовательно читает из этих файлов. Поскольку эти файлы могут быть буквально в тысячах, мне нужен способ выйти из цикла for и do без зависания системы, как сейчас, когда нажата кнопка остановки поиска.Как изящно выйти из цикла в .net VB

В настоящее время лучшим методом, который я нашел для использования, является установка цикла x на последнее число при нажатии кнопки остановки поиска.

Я попытался выйти из цикла с выходом и выходом, но это не имело никакого значения, почему система зависает некоторое время, прежде чем система сможет остановить цикл. Я должен нажать несколько раз кнопку остановки поиска, прежде чем программа станет отзывчивой. Ниже часть коды, который делает петлю: -

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles 
    Button1.Click 

    stopsearch = False 

    Dim x As Single 

    Dim startvalue As Single 
    Dim endvalue As Single 


    startvalue = Val(TextBox1.Text) 
    endvalue = Val(TextBox2.Text) 



    If TextBox4.Text <> "" Then 


     ListView1.Items.Clear() 

     ProgressBar1.Minimum = startvalue 
     ProgressBar1.Maximum = endvalue 

     Button1.Text = "Searching . . . " 

     For x = startvalue To endvalue 
      ProgressBar1.Value = x 
      Dim f As String 

      If stopsearch = True Then 
       x = endvalue 
        exit for 
      End If 


      f = TextBox3.Text + "-" + Trim(Str(x)) + "." + company 

      If File.Exists(D_Drive + "\STORE-16\" + f) Then 

       'MsgBox(f) 

       FileClose(30) 
       FileOpen(30, D_Drive + "\store-16\" + f, OpenMode.Input) 


       Try 
        Dim sr As String = "" 
        Do While Not EOF(30) 
         sr = LineInput(30) 


         If InStr(UCase(sr), UCase(TextBox4.Text)) > 0 Then 

          Dim i As ListViewItem = ListView1.Items.Add(Str(x)) 
          i.SubItems.Add(sr) 
          Application.DoEvents() 

         End If 
        Loop 
       Finally 
        FileClose(30) 
       End Try 

      End If 


     Next x 

     Button1.Text = "Re-start Search " 

    End If 
End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    stopsearch = True 
End Sub 
+0

'они не имели никакого значения, почему система зависает какое-то время, прежде чем система сможет остановить цикл« quit », вызвав« DoEvents », не обновлять индикатор выполнения в цикле и некоторых других, но это не код обзор. Чтобы выйти из цикла, просто вызовите 'Exit For' ... Просто установка переменной не выходит из цикла, поэтому, потому что она все еще продолжается. – Codexer

+0

В другом примечании 'vb6 <> vb.net' ... В вашем коде вы ссылаетесь на него много. Я бы рекомендовал вырезать его и использовать новые функции и методы .net. – Codexer

+0

Zaggler для комментариев - я вставил Exit Для даже попытался попытаться не обновить индикатор выполнения. , , Я не могу помочь себе, но использовать код vb6 - если бы кто-то мог преобразовать мой код с новыми функциями и методами .net, чтобы я мог учиться. , Я не знаю, когда смотрю на этот код, где начать внедрение. , , –

ответ

-1

После выполнения некоторых дальнейших исследований я обнаружил, что если я прилагаю свой код в потоке я мог безотказно остановить цикл (приостановить поток).

Если вы используете поток так, как я есть; это предпочтительно, чтобы при загрузке формы у вас есть следующий код: -

Private Sub LaybuyInputDialog_Load(sender As Object, e As EventArgs) Handles Me.Load 

     Me.CheckForIllegalCrossThreadCalls = False 

    End Sub 

Также не забудьте вставить Imports.System.Threading поверх формы.

Ради кого-то нового закручиванием ниже код, который я изменил: -

Dim thread As System.Threading.Thread 



    Private Sub DoSearch() 

     Button1.Hide() 

     stopsearch = False 

     Dim x As Single 

     Dim startvalue As Single 
     Dim endvalue As Single 


     startvalue = Val(TextBox1.Text) 
     endvalue = Val(TextBox2.Text) 



     If TextBox4.Text <> "" Then 


      ListView1.Items.Clear() 

      ProgressBar1.Minimum = startvalue 
      ProgressBar1.Maximum = endvalue 

      Button1.Text = "Searching . . . " 

      For x = startvalue To endvalue 
       ProgressBar1.Value = x 
       Dim f As String 

       If stopsearch = True Then 
        x = endvalue 
        Exit For 
       End If 



       f = TextBox3.Text + "-" + Trim(Str(x)) + "." + company 

       If File.Exists(D_Drive + "\STORE-16\" + f) Then 

        'MsgBox(f) 

        FileClose(30) 
        FileOpen(30, D_Drive + "\store-16\" + f, OpenMode.Input) 


        Try 
         Dim sr As String = "" 
         Do While Not EOF(30) 
          sr = LineInput(30) 

          If stopsearch = True Then 
           x = endvalue 
           Exit Do 
          End If 

          If InStr(UCase(sr), UCase(TextBox4.Text)) > 0 Then 

           Dim i As ListViewItem = ListView1.Items.Add(Str(x)) 
           i.SubItems.Add(sr) 
           If ListView1.Items.Count > 0 Then 
            ListView1.Items(ListView1.Items.Count - 1).EnsureVisible() 
           End If 
           Application.DoEvents() 

          End If 
         Loop 
        Finally 
         FileClose(30) 
        End Try 

       End If 


      Next x 

      Button1.Text = "Re-start Search " 

     End If 
    End Sub 


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     thread = New System.Threading.Thread(AddressOf DoSearch) 
     thread.Start() 


    End Sub 

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
     stopsearch = True 
     Try 
      thread.Suspend() 
     Catch ex As Exception 
      ' 
     End Try 

    End Sub 

Надежда мой ответ поможет кому-то; пожалуйста, не стесняйтесь комментировать, если у вас есть лучшее решение! !