2015-06-19 6 views
0

у меня есть следующие подвидыSub выполнен перед другим

Public Sub Transfer() 
     Dim i As Integer 
     Dim j As Integer 
     Dim k As Integer 
     Dim Searching_Date As String 
     Dim Name As String 
     Dim Presente As Boolean 
     Dim Foto_Presente As Boolean 


     For i = 0 To CDIi - 1 
      Searching_Date = Image_Date(Camera_Day_Images(i)) 
      Name = Replace(Camera_Day_Images(i), Camera & Path_in_Camera & "\", "") 

      Presente = False 
      j = 0 
      While (Not Presente And j <= PCi) 
       If (Path & "\" & Right_Date(Searching_Date)) = PC_Directory(j) Then 
        Presente = True 
       Else 
        Presente = False 
       End If 
       j = j + 1 
      End While 

      If Presente = True Then 
       Foto_Presente = False 
       k = 0 
       List_PC_Day_Images(Path & "\" & Right_Date(Searching_Date)) 
       While (Not Foto_Presente And k <= PDIi) 
        If (Path & "\" & Right_Date(Searching_Date) & "\" & Name) = PC_Day_Images(k) Then 
         Foto_Presente = True 
        Else 
         Foto_Presente = False 
        End If 
        k = k + 1 
       End While 
       If Foto_Presente = True Then 

       Else 
        My.Computer.FileSystem.CopyFile(Camera & Path_in_Camera & "\" & Name, Path & "\" & Right_Date(Searching_Date) & "\" & Name) 
        PC_Day_Images(PDIi) = Path & "\" & Right_Date(Searching_Date) & "\" & Name 
        PDIi = PDIi + 1 
       End If 

      Else 
       My.Computer.FileSystem.CreateDirectory(Path & "\" & Right_Date(Searching_Date)) 
       My.Computer.FileSystem.CopyFile(Camera & Path_in_Camera & "\" & Name, Path & "\" & Right_Date(Searching_Date) & "\" & Name) 
      End If 
     Next 
     Principale.LFine.Text = "Tutte le tue foto sono state trasferite con successo" 
     Principale.Button1.Enabled = False 
    End Sub 

It копии любых фотографий с устройства на компьютер. Поэтому, если у меня много фотографий, может потребоваться несколько раз, и я хочу уведомить об этом. Фактически я меняю текст на ярлыке, чем я называю Sub и, наконец, заменяю ярлык.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     LFine.Text = "attendere prego..." 
     Transfer() 
     LFine.Text = "Operazione completata con successo" 
    End Sub 

Но результаты состоят в том, что Transfer() начинается и сразу после того, как он закончил изменять метку.

Почему ??? Как я могу исправить эту проблему? Спасибо.

ответ

0

Wrap вызов tranfers() в if заявлении

Измените ваш Sub к Function,

Public Function Transfer() As Boolean 

... 

then 

    If tranfers() = true then 

    LFine.Text = "Operazione completata con successo" 
    End if 
0

Это потому, что ваш процесс является блокирующим процессом. Метка «обновляется», но форма перерисовывается только после завершения всего процесса. Другие предложили использовать Application.DoEvents() или LFine.Update, но лучший способ сделать то, что вы хотите, - сделать ваш процесс параллельным.

Вы можете использовать BackgroundWorker для этого:

Imports System.ComponentModel 

Dim bgw As New BackgroundWorker 

В Load случае вашей формы ...

AddHandler bgw.DoWork, AddressOf bgw_DoWork 
AddHandler bgw.RunWorkerCompleted, AddressOf bgw_RunWorkerCompleted 

А затем установить свой код, как это ...

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    LFine.Text = "attendere prego..." 
    bgw.RunWorkerAsync() 
End Sub 

Private Sub bgw_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork 
    Dim i As Integer 
    Dim j As Integer 
    Dim k As Integer 
    Dim Searching_Date As String 
    Dim Name As String 
    Dim Presente As Boolean 
    Dim Foto_Presente As Boolean 


    For i = 0 To CDIi - 1 
     Searching_Date = Image_Date(Camera_Day_Images(i)) 
     Name = Replace(Camera_Day_Images(i), Camera & Path_in_Camera & "\", "") 

     Presente = False 
     j = 0 
     While (Not Presente And j <= PCi) 
      If (Path & "\" & Right_Date(Searching_Date)) = PC_Directory(j) Then 
       Presente = True 
      Else 
       Presente = False 
      End If 
      j = j + 1 
     End While 

     If Presente = True Then 
      Foto_Presente = False 
      k = 0 
      List_PC_Day_Images(Path & "\" & Right_Date(Searching_Date)) 
      While (Not Foto_Presente And k <= PDIi) 
       If (Path & "\" & Right_Date(Searching_Date) & "\" & Name) = PC_Day_Images(k) Then 
        Foto_Presente = True 
       Else 
        Foto_Presente = False 
       End If 
       k = k + 1 
      End While 
      If Foto_Presente = True Then 

      Else 
       My.Computer.FileSystem.CopyFile(Camera & Path_in_Camera & "\" & Name, Path & "\" & Right_Date(Searching_Date) & "\" & Name) 
       PC_Day_Images(PDIi) = Path & "\" & Right_Date(Searching_Date) & "\" & Name 
       PDIi = PDIi + 1 
      End If 

     Else 
      My.Computer.FileSystem.CreateDirectory(Path & "\" & Right_Date(Searching_Date)) 
      My.Computer.FileSystem.CopyFile(Camera & Path_in_Camera & "\" & Name, Path & "\" & Right_Date(Searching_Date) & "\" & Name) 
     End If 
    Next 
End Sub 

Private Sub bgw_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted 
    Principale.LFine.Text = "Tutte le tue foto sono state trasferite con successo" 
    Principale.Button1.Enabled = False 
End Sub 

Просто убедитесь, что вы не получили доступ к какому-либо контролю вашей формы внутри bgw_DoWork.

+0

Большое спасибо! И если я хочу сделать то же самое с «LFine.Update()» с формой? Завершить форму Form_Load перед Sub Transfer()? Я предпочитаю не использовать фоновый рабочий. –

Смежные вопросы