有一些代码将文件上传到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
但是除此之外,我想显示自定义表单,当它上面有进度条,并且会在获取文件和显示进度时显示,然后解压并解锁父表单。我不知道如何将价值传递给我动态表格的进度条。我试着这样开始改变我现在的代码:
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
新表单:
Public Class 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 :(得分:0)
我之前从未使用过这个,但在WINSCP website上看了一下之后,这可能会奏效。您可能需要更多地调查它以使其正常工作。
如果文件传输在自己的线程中运行并且没有冻结ui,请尝试使用
向表单添加进度条控件 将minimum属性设置为0 将maximum属性设置为1 将visible属性设置为false 在您要显示进度条的位置,插入类似
的代码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,并且如果传输失败则需要终止循环。
答案 1 :(得分:0)
我不是使用dim来创建表单,而是使用visual studio的add new item添加表单 - 右键单击右侧的Project名称(不是解决方案名称)即可访问该表单。弹出上下文菜单。选择“添加”,然后单击“新建项目”,并选择与项目类型相同的相应表单。
将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。
此外,您最初在原始表单中定义函数和这两个变量,您需要将它们从Private更改为Public,以便新表单可以看到它们
我认为应该这样做。如果你有任何问题让我知道,但我不会在接下来的几天回家,所以我可能不会回复到深夜 - 有点像今晚:))