<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=7829</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7829&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard».]]></description>
		<lastBuildDate>Tue, 04 Dec 2012 05:53:25 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66541#p66541</link>
			<description><![CDATA[<p>Сами движки JScript и VBScript многопоточность поддерживают, судя по тому, что их потоковая модель обозначена в реестре как &quot;Both&quot;. Так что дело за хостом. У объектов Windows Script Host — Shell и Network — потоковая модель &quot;Apartment&quot;, т.е. однопоточная, так что, видимо, WSH потоки не поддерживает.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Tue, 04 Dec 2012 05:53:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66541#p66541</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66518#p66518</link>
			<description><![CDATA[<p>Если стоит IE8 и выше, то доступен HTML 5-объект Worker. Стандартными средствами добиться многопоточности вряд ли выйдет. У меня получилось только псевдомногопоточности благодаря связки между процессами через COM-связь.</p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Mon, 03 Dec 2012 19:13:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66518#p66518</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66459#p66459</link>
			<description><![CDATA[<div class="quotebox"><cite>chessman пишет:</cite><blockquote><p>Скорее всего можно в новом потоке создавать новый объект скрипта и скармливать ему кусок кода, вот тогда наверное заработает параллельность. <br />Но это просто мысли вслух.</p></blockquote></div><p>Может, свой скрипт-контрол соорудить многопоточный? <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Как-то я читал, что требуется от скрипт-хоста — вроде не так много, какие-то два или три интерфейса. Всю работу ведь по идее движок будет делать. Интересно было бы попробовать.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Mon, 03 Dec 2012 14:04:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66459#p66459</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66447#p66447</link>
			<description><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>...что поэкспериментировал с кодом внутри Dynwrapx.</p></blockquote></div><p>Да, я это имел ввиду.<br />Знакомая техника, я что-то подобное использовал в борьбе с Microsoft Outllook , но все равно интересно <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.<br />Спс.</p><p>Скорее всего можно в новом потоке создавать новый объект скрипта и скармливать ему кусок кода, вот тогда наверное заработает параллельность. <br />Но это просто мысли вслух.</p>]]></description>
			<author><![CDATA[null@example.com (chessman)]]></author>
			<pubDate>Mon, 03 Dec 2012 10:17:13 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66447#p66447</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66446#p66446</link>
			<description><![CDATA[<p><strong>chessman</strong><br />Я имел в виду, что поэкспериментировал с кодом внутри Dynwrapx. Добавил в RegisterCallback ещё один параметр, по которому она помещала в структуру Callback вместо указателя на объект функции указатель на IStream, полученный от CoMarshalInterThreadInterfaceInStream. Добавил метод NewThread, который запускал новый поток со встроенной функции, которая в свою очередь вызывала CoInitialize и CoGetInterfaceAndReleaseStream и заменяла в структуре Callback указатель на IStream указателем на прокси. После этого вызовы из нового потока по указателю, возвращаемому RegisterCallback, работают, запускается функция скрипта, но, скажем, вот такой цикл<br /></p><div class="codebox"><pre><code>
For i=0 to 7
    DX.Beep 800, 100
    WSH.Sleep 1000
Next
</code></pre></div><p>при этом останавливается и ждёт, пока я не закрою диалоговое окно, выведенное функцией, т.е. видно, что параллельного выполнения нет. Функция просто вклинивается между командами скрипта. Интересно, что если вторую команду цикла реализовать как DX.Sleep 1000, функция цикл не прерывает. Видимо, при вызове WSH.Sleep проверяется очередь сообщений и обрабатывается сообщение, полученное от прокси, а Dynwrapx, конечно, этого не делает.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Mon, 03 Dec 2012 10:00:50 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66446#p66446</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66433#p66433</link>
			<description><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>В общем, мне удалось вызвать функцию скрипта из другого потока, но толку от этого нет, т.к. скрипт не выполняется параллельно, а ждёт завершения этой функции.</p></blockquote></div><p>Юрий, поделись, как сделал.</p>]]></description>
			<author><![CDATA[null@example.com (chessman)]]></author>
			<pubDate>Mon, 03 Dec 2012 08:07:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66433#p66433</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66398#p66398</link>
			<description><![CDATA[<div class="quotebox"><cite>vo1ty пишет:</cite><blockquote><p>Есть пока что одно нехорошее решение.</p></blockquote></div><p>На самом деле поток там один и тот же. Это можно проверить, посмотрев через API GetWindowThreadProcessId, каким потоком создаются диалоговые окна в этом примере:<br /></p><div class="codebox"><pre><code>
doc = new ActiveXObject(&quot;htmlfile&quot;);
doc.parentWindow.setTimeout(function() {
  WScript.Echo(&#039;this is thread!&#039;);
}, 0);

WScript.Echo(&quot;The end.&quot;)
</code></pre></div><p>Посмотреть можно, например, скриптом AutoHotkey:<br /></p><div class="codebox"><pre><code>
F11::
    hWnd := WinExist(&quot;A&quot;)
    ThreadID := DllCall(&quot;user32.dll\GetWindowThreadProcessId&quot;
                            , &quot;Ptr&quot;, hWnd, &quot;Ptr&quot;, 0)
    MsgBox, %ThreadID%
Return
</code></pre></div><p>Насколько я понимаю суть проблемы, функцию скрипта можно вызвать из другого потока, но выполняться она будет в своём, а не в том, который её вызвал. Код скрипта, видимо, выполняется в однопоточном апартменте (single-threaded apartment). Поэтому вызовы к его объектам (а функция — это объект) из других потоков должны идти не напрямую, а через прокси. Прокси создаётся в вызывающем потоке при маршалинге в него указателя на интерфейс вызываемого объекта. Вызывающий код получает указатель на этот прокси, а не на оригинальный объект. Сам прокси также не вызывает методы объекта напрямую, а посылает оконное сообщение в вызываемый поток. И уже там по этому сообщению вызывается метод объекта, т.е. работает он в своём потоке. Так что параллельности не получается.</p><p>Если просто использовать в другом потоке указатель на объект функции, без маршалинга, и попробовать вызвать функцию напрямую, то вернётся код ошибки. Не знаю, есть ли там какая-то защита от такого вызова или просто функции нужно что-то, хранящееся в локальной памяти потока (TLS), и она этого в другом потоке не находит. Указатель на объект DynamicWrapperX, к примеру, можно передать в другой поток и вызвать оттуда напрямую его метод, и там выполнение действительно пойдёт параллельно (другое дело, что он на это не рассчитан). С объектом функции это не проходит.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Sun, 02 Dec 2012 14:09:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66398#p66398</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66321#p66321</link>
			<description><![CDATA[<p>Есть пока что одно нехорошее решение.</p><div class="codebox"><pre><code>doc = new ActiveXObject(&quot;htmlfile&quot;);
doc.parentWindow.setTimeout(function() {
  WScript.Echo(&#039;this is thread!&#039;);
}, 0);</code></pre></div><p>Не нравится оно мне тем, что приходится загружать ещё и htmlfile, не говоря уж о том, что, ВОЗМОЖНО (хотя я сомневаюсь), работа этого скрипта будет зависеть от настроек IE. Надеюсь, что его нельзя заблокировать.</p>]]></description>
			<author><![CDATA[null@example.com (vo1ty)]]></author>
			<pubDate>Sat, 01 Dec 2012 08:39:08 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66321#p66321</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66312#p66312</link>
			<description><![CDATA[<p>В общем, мне удалось вызвать функцию скрипта из другого потока, но толку от этого нет, т.к. скрипт не выполняется параллельно, а ждёт завершения этой функции.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Fri, 30 Nov 2012 15:29:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66312#p66312</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66303#p66303</link>
			<description><![CDATA[<p>Да, в другом потоке выполнить функцию скрипта не удаётся. Причины тут где-то глубоко, сам я до них не докапывался. Думаю, <strong>chessman</strong> имеет что сказать по данной проблеме, судя по <a href="http://forum.script-coding.com/viewtopic.php?pid=61310#p61310">этому</a> сообщению. Если он заглянет в эту тему, то, возможно, пояснит подробнее. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Fri, 30 Nov 2012 03:30:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66303#p66303</guid>
		</item>
		<item>
			<title><![CDATA[JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66300#p66300</link>
			<description><![CDATA[<p>Здравствуйте! Уже не раз работал с RegisterCallback (DynamicWrapperX), создавая клавиатурные хуки и даже регистрируя классы окон (для всего этого нужно указывать callback-функции), но с потоками проблемы.<br /></p><div class="codebox"><pre><code>DX = new ActiveXObject(&quot;DynamicWrapperX&quot;);
DX.Register(&quot;kernel32&quot;, &quot;CreateThread&quot;, &quot;i=puppup&quot;, &quot;r=h&quot;); // на параметры не ругается, хотя, возможно, я что-то неверно указал
TProc = function(pp)
{
  // Этот поток должен выполняться &quot;параллельно&quot;, не зависимо
  WScript.Echo(&#039;thread created&#039;);
  // Вывод в качестве примера, естественно.
  return 0;
}
pTProc = DX.RegisterCallback(TProc, &quot;i=p&quot;, &quot;r=p&quot;); // также не исключаю, что что-то неверно, но ошибки не выползают.
thr = DX.CreateThread(0, 0, pTProc, 0, 0, 0);
WScript.Echo(thr);
// Выводит целое число &gt; 0. Если верить MSDN, это значит, что поток создан без ошибок.
// В это же время, по идее, должно выводиться сообщение &#039;thread created&#039;, но ничего нет.</code></pre></div><p>Что я не так делаю? И, может, не стоило париться с велосипедом, и есть более доступные способы запустить два потока одновременно?<br />Пусть вас не пугает, что я использую CreateThread, указывая только третий параметр. Аналогичная программа в C++ работает без каких-либо нареканий. Если нужно, могу дать пример.</p>]]></description>
			<author><![CDATA[null@example.com (vo1ty)]]></author>
			<pubDate>Thu, 29 Nov 2012 19:48:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66300#p66300</guid>
		</item>
	</channel>
</rss>
