<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS: Ожидание события с отсчетом времени]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6744&amp;type=atom" />
	<updated>2012-01-29T11:43:35Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=6744</id>
		<entry>
			<title type="html"><![CDATA[VBS: Ожидание события с отсчетом времени]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56098#p56098" />
			<content type="html"><![CDATA[<p>Здравствуйте, уважаемые коллеги.<br />Хочу поделиться реализацией ожидания события используя синхронный и асинхронный режим подписки на события. <br />Решал с целью запуска процесса на удаленной машине и последующего ожидания завершения его выполнения.<br />Если с ожиданием события &quot;до упора&quot; все более-менее просто:<br /></p><div class="codebox"><pre><code>
Const Process = &quot;notepad.exe&quot;

Set objWMI = GetObject(&quot;winmgmts:\\.\Root\CIMV2&quot;)

ret = objWMI.Get(&quot;Win32_Process&quot;).Create(Process, , , intProcessID)
If ret &lt;&gt; 0 Then
	MsgBox &quot;Не удалось создать процесс &quot; &amp; Process
	WScript.Quit
End If
	
Call ProcessFinished(intProcessID)

MsgBox &quot;Процесс &quot; &amp; Process &amp; &quot; завершен&quot;

&#039;функция ожидания завершения процесса &quot;до упора&quot;
Function ProcessFinished(intProcessID)
	Dim colProcesses, objProcess	
	Set colProcesses = objWMI.ExecNotificationQuery( _
			&quot;SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA &#039;Win32_Process&#039;&quot; &amp; _
			&quot; AND TargetInstance.ProcessID = &#039;&quot; &amp; intProcessID &amp; &quot;&#039;&quot;) 	
	Do
		Set objProcess = colProcesses.NextEvent		
			ProcessFinished = True
			Exit Function		
	Loop	
End Function</code></pre></div><p>То с ожиданием, например, в течение определенного количества времени (я бы предпочел именно этот вариант), на мой взгляд, поинтереснее:<br /></p><div class="codebox"><pre><code>
Const Process = &quot;notepad.exe&quot;

Set objWMI = GetObject(&quot;winmgmts:\\.\Root\CIMV2&quot;)

ret = objWMI.Get(&quot;Win32_Process&quot;).Create(Process, , , intProcessID)
If ret &lt;&gt; 0 Then
	MsgBox &quot;Не удалось создать процесс &quot; &amp; Process
	WScript.Quit
End If

Dim objSink, bFinish

If ProcessFinishedA(intProcessID, 5) Then
	MsgBox &quot;Процесс &quot; &amp; Process &amp; &quot; завершен&quot;
Else
	MsgBox &quot;Процесс &quot; &amp; Process &amp; &quot; не завершен&quot;
End If

&#039;функция ожидания завершения процесса в течение определенного количеста секунд
Function ProcessFinishedA(intProcessID, intSec)
	Set objSink = WScript.CreateObject(&quot;WbemScripting.SWbemSink&quot;,&quot;SINK_&quot;)
	objWMI.ExecNotificationQueryAsync objSink, _
			&quot;SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA &#039;Win32_Process&#039;&quot; &amp; _
			&quot; AND TargetInstance.ProcessID = &#039;&quot; &amp; intProcessID &amp; &quot;&#039;&quot;	
	Do 
		If bFinish Then
			ProcessFinishedA = True
			Exit Function
		End If		
		If i = intSec Then Exit Function		
		i = i + 1		
		WScript.Sleep(1000)		
	Loop
End Function

Sub SINK_OnObjectReady(objObject, objAsyncContext)    
	bFinish = True
End Sub</code></pre></div><p>Возможно кому-нибудь пригодится.</p>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2012-01-29T11:43:35Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56098#p56098</id>
		</entry>
</feed>
