判断进程结束和多进程问题

yanstill 2007-01-20 12:30:34
我在vb程序中调用shell函数,执行.bat批处理文件
现在知道利用API 可以判断一个进程是否结束,如下
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFFFFFF
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

但是调用了WaitForSingleObject后,vb中的其他程序都不能运行了,我可以同时判断进程是否结束,同时也能在vb中做其他操作呢?
我不知道这个是不是和多进程有关,请高手指点一下吧
...全文
387 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanstill 2007-02-01
  • 打赏
  • 举报
回复
RetProcess = Shell("cmd.exe d:\user.bat", vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, RetProcess)
这一段是放在General里面吗?
yanstill 2007-01-22
  • 打赏
  • 举报
回复
我在WaitForSingleObject加了一句:DoEvents
然后运行的时候发现还是老样子,我一把cmd.exe的窗口移动,vb窗口就会出现一个白框框,和程序没响应一样。
yanstill 2007-01-22
  • 打赏
  • 举报
回复
呵呵,虽然还不怎么明白,谢谢你们了。
jwh2004 2007-01-22
  • 打赏
  • 举报
回复
WaitForSingleObject是阻塞该语句中信号以外所有当前程序消息队列的消息处理,
vc中用WaitForMultipleObjects来同时等待消息和让当前程序处理本程序消息队列的消息。
不过vb因是以单线程为主,不知能否用WaitForSingleObject。
我觉得最好还是在定时器中进行查询。
jwh2004 2007-01-21
  • 打赏
  • 举报
回复
你为什么不用Shell来调用外部应用程序呢,
然后在定时器中用“GetExitCodeProcess”api来检测调用的外部应用程序(就是cmd.exe)是否结束了运行。
示例如下
Private Declare Function OpenProcess Lib "Kernel32" (ByVal dwDesiredAccess _
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "Kernel32" _
(ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetExitCodeProcess Lib "Kernel32" _
(ByVal hProcess As Long, lpExitcode As Long) As Long
Private Declare Function CloseHandle Lib "Kernel32" (ByVal hobject As Long) As Long

Private RetProcess As Double
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STATUS_PENDING = &H103&
Private hProcess As Long, Exitcode As Long

RetProcess = Shell("cmd.exe d:\user.bat", vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, RetProcess)

'用定时器检测进程是否退出
Private Sub TimerProcess_Timer()
TimerProcess.Enabled = False
Call GetExitCodeProcess(hProcess, Exitcode)
If Exitcode <> STATUS_PENDING Then
'进程已关闭
Call CloseHandle(hProcess)
TimerProcess.Enabled = False
Else
'进程未关闭
TimerProcess.Enabled = True
End If
End Sub
yanstill 2007-01-21
  • 打赏
  • 举报
回复
用DoEvent可以怎么做呢?
我不懂线程,可不可以讲具体一点呢?
谢谢了哦
zzyong00 2007-01-21
  • 打赏
  • 举报
回复
cmd.exe win2k和xp下的命令行控制台,在cmd.exe下运行user.bat
yanstill 2007-01-21
  • 打赏
  • 举报
回复
RetProcess = Shell("cmd.exe d:\user.bat", vbNormalFocus) 是不是就是调用bat文件?
"cmd.exe d:\user.bat"这个我不怎么懂?
jingzhongrong 2007-01-20
  • 打赏
  • 举报
回复
WaitForSingleObject本来就是是阻塞的
只有当其返回时才会接着执行下面语句
用多线程可以解决

DoEvent
yanstill 2007-01-20
  • 打赏
  • 举报
回复
一天了啊!!!
唉...
yanstill 2007-01-20
  • 打赏
  • 举报
回复
为什么没有人呢?
是我的问题不够明确吗 ?
还是什么原因?

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧