我用shell启动一个后台程序,这需要在不同机型上测试,因此运行时间不确定,我想在等待过程中用进度条模拟后台正在运行(进度条显示的进度允许重复,即进度满了后须重新开始),于是使用Timer控件来控制进度条,可是进度条没有响应。
我使用Timer控件和Shell、OpenProcess、WaitForSingleObject等api函数方式的思路如下:
  PBar.Max = 100'进度条赋值
  PBar.Min = 0
  iSum =0
  Timer1.Enabled = True
  lngTask = Shell(App.Path & "\xxx.exe", vbHide)'启动一个后台程序
  pHandle = OpenProcess(SYNCHRONIZE, False, lngTask)
  ret = WaitForSingleObject(pHandle, INFINITE)
  ret = CloseHandle(pHandle)
  Timer1.Enabled = False
  PBar.Value = 100'运行完毕时进度条处理方式Private Sub Timer1_Timer()
iSum = IIf(iSum > 99, 1, iSum + 1)
PBar.Value = iSum
DoEvents
End Sub
'''窗体级变量及函数声明
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Dim  iSum As Long
Private Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000
请大虾们指点,谢谢先!

解决方案 »

  1.   

    我估计是你使用API创建线程的模式是“同步”的关系,如果改成是异步应该就好了。
      

  2.   


    Private Sub Timer1_Timer() 
    PBar.Value = IIf(iSum > 99, 1, iSum + 1) 
    Me.Refresh
    End Sub 将工程编译为 .exe 文件后运行,Timer 才会生效。在 Debug 界面是看不出效果的。
      

  3.   

    WaitForSingleObject的目的就是为了“挂起”当前进程进行等待,挂起时不会触发Timer事件。
      

  4.   

    有点明白了,如何才能做到既可跟踪后台运行情况,又可同时触发Timer事件啦?请各位高手赐教!
      

  5.   

    不一定要用多线程,可以试试下面的方案:
    正常打开后台程序,纪录lngTask,启动定时器;
    在定时器中,调用OpenProcess(PROCESS_QUERY_INFORMATION,false,lngTask):如果返回错误,后台已经结束;否则CloseHandle()并且刷新进度条。