<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript / WSHController : Попытка асинхронного запуска]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=3963</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=3963&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript / WSHController : Попытка асинхронного запуска».]]></description>
		<lastBuildDate>Thu, 10 Dec 2009 10:40:57 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript / WSHController : Попытка асинхронного запуска]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=31402#p31402</link>
			<description><![CDATA[<p>Мда....&nbsp; &nbsp;тоже тупиково...&nbsp; &nbsp;щас бы с Ken-ом Mayer-ом кофеёк погонять, мыслишками раскинуть... <img src="//forum.script-coding.com/img/smilies/tongue.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Евген)]]></author>
			<pubDate>Thu, 10 Dec 2009 10:40:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=31402#p31402</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WSHController : Попытка асинхронного запуска]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=31388#p31388</link>
			<description><![CDATA[<p>При попытке использовать более одного запущенного экземпляра скрипта начинаются проблемы, которые, отчасти, можно, хоть и через @@@@, но обойти.<br /></p><div class="codebox"><pre><code>Option Explicit

Dim arrComputers, elem
Dim objWshController, objWshRemote
Dim dictWshRemotes
Dim boolDone, lngCount

arrComputers = Array(&quot;Machine01&quot;, &quot;Machine02&quot;, &quot;Machine03&quot;, &quot;Machine04&quot;, &quot;Machine05&quot;)

boolDone = False
lngCount = 0

Set objWshController = WScript.CreateObject(&quot;WSHController&quot;)
Set dictWshRemotes   = WScript.CreateObject(&quot;Scripting.Dictionary&quot;)

For Each elem In arrComputers
    WScript.Echo elem
    dictWshRemotes.Add elem, objWshController.CreateScript(&quot;C:\Песочница\41\SimpleSleep3000.vbs&quot;, elem)
    WScript.ConnectObject dictWshRemotes.Item(elem), &quot;WshRemote_&quot;
    
    lngCount = lngCount + 1
    
    dictWshRemotes.Item(elem).Execute
Next

Do
    WScript.Sleep 100
Loop Until boolDone

For Each elem In arrComputers
    WScript.Echo elem
    WScript.DisconnectObject dictWshRemotes.Item(elem)
    Set dictWshRemotes.Item(elem) = Nothing
    dictWshRemotes.Remove elem
Next

Set dictWshRemotes   = Nothing
Set objWshController = Nothing

WScript.Quit 0
&#039;=============================================================================

&#039;=============================================================================
Sub WshRemote_Start
    WScript.Echo &quot;&gt; Script start&quot;
End Sub
&#039;=============================================================================

&#039;=============================================================================
Sub WshRemote_End
    WScript.Echo &quot;&lt; Script end&quot;
    
    lngCount = lngCount - 1
    
    If lngCount = 0 Then
        boolDone = True
    End If
End Sub
&#039;=============================================================================</code></pre></div><p>Создаём словарь, проходим по списку машин, добавляем объектную переменную в словарь, наращиваем счётчик, запускаем на исполнение. В событии останова уменьшаем счётчик, пока он не станет равным нулю. После завершения всех заданий пробегаемся по словарю, отстыковываемся от событий объектов, очищаем ссылки, очищаем словарь.<br /></p><div class="quotebox"><blockquote><div class="codebox"><pre><code>Machine01
Machine02
&gt; Script start
Machine03
&gt; Script start
Machine04
&gt; Script start
Machine05
&gt; Script start
&gt; Script start
&lt; Script end
&lt; Script end
&lt; Script end
&lt; Script end
&lt; Script end
Machine01
Machine02
Machine03
Machine04
Machine05</code></pre></div></blockquote></div><p>Где здесь главная проблема? Главная проблема в том, что внутри процедуры обработки события «WshRemote_End» мы никак не можем <em>гарантированно</em> определить, от какого именно объекта WshRemote&#039;а пришло это событие — для этого нет ровным счётом никаких данных. Можно, казалось бы, попытаться перебрать словарь и определить по статусу (WshRemote.Status = WshFinished) от какого именно объекта «WshRemote» пришло событие завершения, отстыковаться от него, очистить объектную переменную и удалить её из словаря. Но суть в том, что велика вероятность того, что, пока мы будем делать этот перебор, в этот промежуток времени завершится ещё одно или более заданий, т.е. окажется, что сразу несколько «WshRemote» из словаря будут иметь .Status = WshFinished. И всё, приплыли — мы опять застряли как буриданов осёл.</p><p>Для приведённого кода проблемы, изложенной в предыдущем абзаце не существует, поскольку тут нет понятия длины очереди (идея, за которую я ратовал в развитие Вашего примера: <a href="http://forum.script-coding.com/viewtopic.php?id=3783">VBScript: асинхронная обработка множественных запросов WMI</a>, а коллега <strong>mozers</strong> реализовал). В принципе, можно ограниченно работать и с длиной очереди — подобно вышеприведённому коду, то есть, задали длину очереди, наполнили очередь и ждём, пока она не станет равной 0 (напомню, что в <a href="http://forum.script-coding.com/viewtopic.php?id=3783">VBScript: асинхронная обработка множественных запросов WMI</a> поддерживается постоянная длина очереди, как только закончился один запрос в очереди — сразу создаётся новый), потом очищаем, наполняем очередь новой порцией запросов и т.д.</p><p>Чем мне не нравится этот подход? Казалось бы, то же самое… Ан нет: хоть сие и даёт более-менее квазипараллельную обработку, но стоит одному единственному запросу «заткнуться» на чём-нибудь надолго — и он «заморозит» всю обработку.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 10 Dec 2009 02:26:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=31388#p31388</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WSHController : Попытка асинхронного запуска]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=31383#p31383</link>
			<description><![CDATA[<p>С одним скриптом всё работает без проблем.</p><p><strong>C:\Песочница\41\SimpleSleep3000.vbs</strong>:<br /></p><div class="codebox"><pre><code>WScript.Sleep 3000</code></pre></div><p>Сам скрипт:<br /></p><div class="codebox"><pre><code>Option Explicit

Dim arrComputers
Dim objWshController, objWshRemote
Dim boolDone

boolDone = False

Set objWshController = WScript.CreateObject(&quot;WSHController&quot;)
Set objWshRemote     = objWshController.CreateScript(&quot;C:\Песочница\41\SimpleSleep3000.vbs&quot;, &quot;localhost&quot;)

WScript.ConnectObject objWshRemote, &quot;WshRemote_&quot;
objWshRemote.Execute

Do
    WScript.Sleep 100
Loop Until boolDone

WScript.DisconnectObject objWshRemote

Set objWshRemote     = Nothing
Set objWshController = Nothing

WScript.Quit 0
&#039;=============================================================================

&#039;=============================================================================
Sub WshRemote_Start
    WScript.Echo &quot;&gt; Script start&quot;
End Sub
&#039;=============================================================================

&#039;=============================================================================
Sub WshRemote_End
    WScript.Echo &quot;&lt; Script end&quot;
    boolDone = True
End Sub
&#039;=============================================================================</code></pre></div><p>Переменные создаются, участвуют в работе, очищаются.<br /></p><div class="quotebox"><blockquote><div class="codebox"><pre><code>&gt; Script start
&lt; Script end</code></pre></div></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Wed, 09 Dec 2009 20:59:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=31383#p31383</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript / WSHController : Попытка асинхронного запуска]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=31364#p31364</link>
			<description><![CDATA[<p><strong>Евген</strong>, он и выполняется асинхронно, вот только Вы тормозите работу текущего скрипта в процедуре посредством:<br /></p><div class="codebox"><pre><code>Do While oProcess.Status &lt;&gt; 2              &#039; ждём окончания удалённой работы скрипта
    WScript.Sleep 100
Loop</code></pre></div><p>Так что, тут ничего удивительного.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Wed, 09 Dec 2009 13:53:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=31364#p31364</guid>
		</item>
		<item>
			<title><![CDATA[VBScript / WSHController : Попытка асинхронного запуска]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=31350#p31350</link>
			<description><![CDATA[<p>Хотя бы попытка была <img src="//forum.script-coding.com/img/smilies/tongue.png" width="15" height="15" /> полунеудачная, так и не получилось сделать задуманное асинхронно, но хотя бы поппытка была, может у кого получилось более удачно, или дальше продвинулся в этом вопросе, с удовольствием пообщаюсь, а напока выкладываю свой вариант: <br />Предположение было следующее, Win32_PingStatus прекрасно работает асинхронно (раньше уже выясняли), дык вот с его помощью хотелось задать начальную асинхронность процессу, и уже в его асинхронных ответах (возвращающихся понгах - событие асинхронное) запускать нужную мне процедуру (в надежде что процесс дальше будет продолжаться асинхронно - многопоточно) , но процесс выстраивается в шеренгу по одному (как в магазине занимают очередь) и вся многопоточность и асинхронность на этом заканчивается <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><div class="codebox"><pre><code>SN=&quot;SomeScript.vbs&quot;
arrComputers = Array(&quot;strComp02&quot;,&quot;strComp03&quot;,&quot;strComp04&quot;,&quot;strComp05&quot;,&quot;strComp06&quot;,&quot;strComp07&quot;,&quot;strComp08&quot;,&quot;strComp09&quot;,&quot;strComp10&quot;,&quot;strComp11&quot;,&quot;strComp13&quot;,&quot;strComp14&quot;,&quot;strComp15&quot;,&quot;strComp16&quot;,&quot;strComp17&quot;,&quot;strComp18&quot;,&quot;strComp19&quot;,&quot;strComp20&quot;,&quot;strComp21&quot;,&quot;strComp22&quot;,&quot;strComp23&quot;,&quot;strComp24&quot;,&quot;strComp26&quot;,&quot;strComp27&quot;,&quot;strComp29&quot;)
Set objService = GetObject(&quot;winmgmts:\\.\Root\CIMV2&quot;)
Set objSink = WScript.CreateObject(&quot;WbemScripting.SWbemSink&quot;, &quot;Sink_&quot;)
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set file = fso.OpenTextFile(&quot;result.log&quot;, 8, True)
file.WriteLine String(28,&quot;-&quot;) &amp; &quot; &quot; &amp; date &amp; &quot;  &quot; &amp; time &amp; String(28,&quot;-&quot;)
bdone = False
strCount=0

For Each strComputer In arrComputers
  Set objContext = CreateObject(&quot;WbemScripting.SWbemNamedValueSet&quot;)
  objContext.Add &quot;hostname&quot;, strComputer
objService.ExecQueryAsync objSink, &quot;select * from Win32_PingStatus where address =&#039;&quot; &amp; strComputer &amp; &quot;&#039;&quot;, , , , objContext
Next

While Not bdone

If strCount=ubound(arrComputers)+1 Then
bdone=True
file.Close
End If

WScript.Sleep 100

Wend

Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext)
strCount=strCount+1
Set strComputer = objWbemAsyncContext.Item(&quot;hostname&quot;)
res=&quot;&quot;
  Select Case objWbemObject.StatusCode
    Case 0
      res = &quot;On&quot;
    Case Else
      res = &quot;Off&quot;
  End Select
If res=&quot;On&quot; Then       &#039;1
Set oController = CreateObject(&quot;WSHController&quot;)
file.WriteLine strComputer &amp; &quot; - On&quot;
On Error Resume Next
Set oProcess = oController.CreateScript(SN,strComputer)
oProcess.Execute
If Err.Number&lt;&gt;0 Then  &#039;2
file.WriteLine strComputer &amp; &quot; - Connection Error !!!&quot;
Err.Clear
On Error Goto 0
Else                   &#039;2                  &#039; если нет ошибок при удалённом запуске
Do While oProcess.Status &lt;&gt; 2              &#039; ждём окончания удалённой работы скрипта
    WScript.Sleep 100
Loop
Set oController = Nothing
file.WriteLine strComputer &amp; &quot; - Sucessfull !!!&quot; &amp; Now
End If                 &#039;2

Else                   &#039;1                  &#039; не отвечает на пинг 
file.WriteLine strComputer &amp; &quot; - Off&quot;
End If                 &#039;1
End Sub</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Евген)]]></author>
			<pubDate>Wed, 09 Dec 2009 05:07:37 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=31350#p31350</guid>
		</item>
	</channel>
</rss>
