2015-10-06 2 views
0

Имейте код, который загружает файлы на FTP и занимает некоторое время до его окончания и достигает следующей строки кода. Тем временем я хотел бы показать индикатор прогресса и форму окна замораживания, пока это не будет сделано. Как это сделать?Индикатор выполнения - отображается перед следующей строкой

WinScp.PutFile(File, destFP, True)   '<---this line taking some time 

    'Progress bar here till it reach next line... 

    If Not lsbxPicPaths.Items.Contains(destFP) Then  
     lsbxPicPaths.Items.Add(destFP) 
    Else 
    ... 

Для дальнейшего обсуждения

Перед open.Session я добавил:

AddHandler session.FileTransferProgress, AddressOf SessionFileTransferProgress 

и ниже персонал был создан:

Function GetFile(source As String, destination As String, Optional removeSource As Boolean = False) 
      Dim result As Boolean = True 
      Try 



       session.GetFiles(source, destination, removeSource).Check() 




      Catch ex As Exception 
       result = False 
       'Logger.LogIt(Alert.Write(MsgType.ERROR), Eng.Write(EngType.COLLEC), Datasource.ToString & " | " & Me.reportName & " | " & ex.ToString, LogPath, isDebug) 
      End Try 
      Return result 
     End Function 

     Private Shared Sub SessionFileTransferProgress(sender As Object, e As FileTransferProgressEventArgs) 
      'Print transfer progress 
      _lastProgress = e.FileProgress 

     End Sub 

     Public Shared _lastProgress As Integer 

    then calling like this: 

     Me.Cursor = Cursors.WaitCursor 
           WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True) 


      form.ProgressBar1.Value = 0 
           ProgressBar1.Show() 

           Do 
            ProgressBar1.Value = WinScpOperation._lastProgress 
            ProgressBar1.Refresh() 
           Loop Until ProgressBar1.Value = 1 



           Me.Cursor = Cursors.Default 

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

Me.Cursor = Cursors.WaitCursor 
          WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True) 


          Dim form As New Form 
          Dim pb As New ProgressBar 
          pb.Minimum = 0 
          pb.Maximum = 1 

          form.ShowDialog() 




'pass value to progress bar 
          form.ProgressBar1.Value = 0 




          ' ProgressBar1.Hide() 
          'ProgressBar1.Value = 0 

form.Close() 



          Me.Cursor = Cursors.Default 

для дальнейшего обсуждения nr.2

Новой форма:

Открытого класса FrmProgressBarWinscp

Property value As Integer 

    Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 


     value = 0 
     ProgressBar1.Value = 0 
     ProgressBar1.Show() 

    End Sub 

    Sub Run() 


     Do 
      ProgressBar1.Value = value 
      ProgressBar1.Refresh() 
     Loop Until value = 1 
     MsgBox("Done") 
     'ProgressBar1.Hide() 
     'ProgressBar1.Value = 0 
    End Sub 


End Class 

и по орг. Форме:

WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True) 

Dim pro As New FrmProgressBarWinscp() 
          pro.ShowDialog() 

          Do 
           pro.value = WinScpOperation._lastProgress 
           pro.Run() 
          Loop Until WinScpOperation._lastProgress 

          Me.Cursor = Cursors.Default 
+0

Связанный вопрос: [Showing WinSCP. NET прогресс передачи данных на индикатор производительности WinForm] (http://stackoverflow.com/q/33012517/850848) –

ответ

0

Вместо того, чтобы использовать dim для создания формы, я бы добавил форму, используя новый элемент visual studio, который можно щелкнуть правой кнопкой мыши по имени вашего проекта (а не имени решения) с правой стороны. Появится контекстное меню. Выберите «Добавить», затем нажмите «Новый элемент» и выберите соответствующую форму, которая будет того же типа, что и ваш проект.

Добавьте ProgressBar в форму - и вы можете оставить свое имя в качестве progressBar1, если вы хотите, но если вы измените это вам нужно изменить ссылки на него в коде ниже

На самом верху код для новой формы добавьте те же строки импорта, которые вы использовали для импорта материала winscp.

Поместите этот блок кода (аналогично вашему коду в обновленном вопросе) в новую форму. Я немного изменил код, чтобы он работал в динамической форме.

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles Me.Load 
    Me.Cursor = Cursors.WaitCursor 
    WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True) 
    progressBar1.Minimum = 0 
    progressBar1.Maximum = 1 
    progressBar1.Value = 0 
    Do 
     progressBar1.value=winscp.FileProgressEventArgs.FileProgress 
     progressbar1.refresh 
    until progressbar1.value=1 
    Me.Cursor = Cursors.Default 
    form.Close() 
End Sub 

Form1.myremotePicturePath и например Form1.ladujZdjeciaPath.

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

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

+0

Это работает, но новая форма появляется не сразу, но основная форма замерзает, и новая форма появляется позже. Это актуальная проблема, чтобы избежать длинных тем, которые я сделал, но вы можете взглянуть ?: http://stackoverflow.com/questions/33012517/forms-progress-bar-doesnt-show-straightaway-winscp – Arie

+0

1) WinSCP ['Session.GetFiles'] (https://winscp.net/rus/docs/library_session_getfiles) блокируется, поэтому это не сработает. 2) Не существует поля 'winscp' в любом месте исходного кода. 3) ['FileTransferProgressEventArgs'] (https://winscp.net/rus/docs/library_filetransferprogresseventargs) (а не' FileProgressEventArgs') - это класс, поэтому вы не можете получить доступ к его файловому процессу. –

0

Я никогда не использовал это раньше, но после того, как немного озираясь на WINSCP website, это может работать. Возможно, вам придется изучить его больше, чтобы заставить его работать.

Если передача файлов работает в отдельном потоке и не замораживает пользовательский интерфейс, попробуйте это

Добавьте элемент управления полоской прогресса в форму Установить минимальное свойство 0 Установить максимальное свойство- установить видимое свойство ложной в точке, где вы хотите, чтобы отобразить индикатор, вставить код что-то вроде

progressbar1.value=0 
progressbar1.show 
Do 
    progressbar1.value=winscp.FileProgressEventArgs.FileProgress 
    progressbar1.refresh 
until progressbar1.value=1 
progressbar1.hide 
progressbar.value=0 

Вам может понадобиться выбрать другое условие для Do/Loop терминации, например, если WINSCP изменил флаг на True, когда файл будет завершен, и вам нужно будет завершить цикл, если передача завершится неудачно.

+0

он работает, однако я хотел бы показать индикатор выполнения в отдельном окне (форме), когда файл загружается, поэтому я создал динамическую форму , но не имеют представления о том, как передать значение ему, и когда он закончит динамическую форму с индикатором выполнения, будет неустойчивым, а формальная форма снова будет работать. И если возможно, чтобы показать прогресс от 0 до 100, а от 0 до 1. Можете ли вы помочь? Я ввел свой новый код в основную тему. – Arie

+0

Как и в предыдущем ответе: 1) WinSCP ['Session.GetFiles'] (https://winscp.net/rus/docs/library_session_getfiles) блокируется, поэтому это не сработает. 2) Не существует поля 'winscp' в любом месте исходного кода. 3) ['FileTransferProgressEventArgs'] (https://winscp.net/rus/docs/library_filetransferprogresseventargs) (а не' FileProgressEventArgs') - это класс, поэтому вы не можете получить доступ к его файловому процессу. –

+1

И вы не должны публиковать два почти одинаковых ответа. Если вы хотите улучшить предыдущий ответ, отредактируйте его, не публикуйте новый. –