用VB做了个ActiveX控件,调用C#编写的WebService,代码如下:
Dim responseText, photoAddr, photoName, photoExt As String
lblTips.Caption = "共需上传 " & SelectedPics & " 张图片,当前正在上传第 1 张"
ProgressBar1.Max = SelectedPics
For i = 0 To SelectedPics - 1
photoAddr = fPhotoUpload.GetPhotoAddress(i)
photoName = ParseFileName(photoAddr)
photoExt = GetFileExt(photoName)
responseText = soapClient.AddUserLocalPicture(sequence, 3, fPhotoUpload.GetBytes(i), photoName, "." & photoExt)
lblTips.Caption = "共需上传 " & SelectedPics & " 张图片,当前正在上传第 " & i + 1 & " 张"
ProgressBar1.Value = ProgressBar1.Value + 1
If ProgressBar1.Value = ProgressBar1.Max Then
Unload Me
End If
DoEvents
Next
循环每次调用WebService方法AddUserLocalPicture时,界面都卡住了,虽然能上传成功但看起来不爽。
在C#中可以用多线程或BackGroundWorker来解决,请问各位高手,在VB中怎么解决呢?
Dim responseText, photoAddr, photoName, photoExt As String
lblTips.Caption = "共需上传 " & SelectedPics & " 张图片,当前正在上传第 1 张"
ProgressBar1.Max = SelectedPics
For i = 0 To SelectedPics - 1
photoAddr = fPhotoUpload.GetPhotoAddress(i)
photoName = ParseFileName(photoAddr)
photoExt = GetFileExt(photoName)
responseText = soapClient.AddUserLocalPicture(sequence, 3, fPhotoUpload.GetBytes(i), photoName, "." & photoExt)
lblTips.Caption = "共需上传 " & SelectedPics & " 张图片,当前正在上传第 " & i + 1 & " 张"
ProgressBar1.Value = ProgressBar1.Value + 1
If ProgressBar1.Value = ProgressBar1.Max Then
Unload Me
End If
DoEvents
Next
循环每次调用WebService方法AddUserLocalPicture时,界面都卡住了,虽然能上传成功但看起来不爽。
在C#中可以用多线程或BackGroundWorker来解决,请问各位高手,在VB中怎么解决呢?
soapClient在init响应时间较长,可以在form_load的时候初始化连接,
但初始化的时候还是会卡住,访问网络时间还是有一点的,就是这样的,程序在等待返回;
除非你另开线程,vb,哎
关于ActiveX.exe其实网上示例很多的,晚饭后给你整理了一段,测试通过了,你参考一下吧:'--------------------------------- ActiveX.exe ----------------------------'新建一个ActiveX.exe工程名称: AxTest
'其中类名称: cTest
'添加一个窗体,默认名称
'窗体上加一个Timer控件,默认名称
'cTest上添加如下代码:Option ExplicitPublic Event TestStart() '启动测试事件
Public Event TestEnd() '结束测试事件
Public Event Testing() '这个事件在循环执行过程中触发Private frm As Form
Private WithEvents oTM As Timer
Private xCount As Long
Private xCounting As Long'当前计数只读
Public Property Get Counting() As Long
Counting = xCounting
End Property'初始化
Private Sub Class_Initialize()
Set frm = New Form1
Load frm
Set oTM = frm.Timer1
oTM.Enabled = False
End Sub'消毁
Private Sub Class_Terminate()
Set oTM = Nothing
Unload frm
End Sub'这个方法用接收主程序参数,通知本程序开始执行任务
Public Function StartTest(pCount As Long) As Boolean
'pCount 要执行任务的次数(你根据自己的实际情况设计)
oTM.Interval = 100
oTM.Enabled = True
xCount = pCount
StartTest = True
End Function'模拟一个较长时间的操作(你的调用web服务大概就写在这儿吧)
Private Sub DataTest()
Dim n As Long
Dim i
For n = 1 To 100000000
i = n * 9
Next
End Sub'
Private Sub otm_Timer()
oTM.Enabled = False
Dim i As Long
RaiseEvent TestStart '触发TestStart事件
'循环执行数据处理过程
For i = 1 To xCount
Call DataTest
xCounting = i '返回计数
RaiseEvent Testing '触发Testing事件,可以让主程序接收当前计数
Next
RaiseEvent TestEnd '触发TestEnd事件
End Sub
'--------------------------------------------------------------------------'-------------------------------- 窗体代码 ----------------------------------------
'引用一下AxTest
'添加二个CommandBoxOption ExplicitDim WithEvents cls As cTestDim pCount As LongPrivate Sub cls_Testing()
Me.Caption = "数据处理中,已经完成 " & cls.Counting & " 项"
End SubPrivate Sub cls_TestStart()
Me.Caption = "数据处理中,已经完成 " & cls.Counting & " 项"
End SubPrivate Sub cls_TestEnd()
Me.Caption = "数据处理完毕,共完成 " & cls.Counting & " 项"
Set cls = Nothing
pCount = 0
End SubPrivate Sub Command1_Click()
Set cls = New cTest
pCount = 5
Call cls.StartTest(pCount)
End SubPrivate Sub Command2_Click()
Debug.Print "Test"
End Sub