<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7829&amp;type=atom" />
	<updated>2012-12-04T05:53:25Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=7829</id>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66541#p66541" />
			<content type="html"><![CDATA[<p>Сами движки JScript и VBScript многопоточность поддерживают, судя по тому, что их потоковая модель обозначена в реестре как &quot;Both&quot;. Так что дело за хостом. У объектов Windows Script Host — Shell и Network — потоковая модель &quot;Apartment&quot;, т.е. однопоточная, так что, видимо, WSH потоки не поддерживает.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2012-12-04T05:53:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66541#p66541</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66518#p66518" />
			<content type="html"><![CDATA[<p>Если стоит IE8 и выше, то доступен HTML 5-объект Worker. Стандартными средствами добиться многопоточности вряд ли выйдет. У меня получилось только псевдомногопоточности благодаря связки между процессами через COM-связь.</p>]]></content>
			<author>
				<name><![CDATA[JSmаn]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24434</uri>
			</author>
			<updated>2012-12-03T19:13:29Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66518#p66518</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66459#p66459" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2012-12-03T14:04:40Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66459#p66459</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66447#p66447" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2012-12-03T10:17:13Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66447#p66447</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66446#p66446" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2012-12-03T10:00:50Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66446#p66446</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66433#p66433" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>В общем, мне удалось вызвать функцию скрипта из другого потока, но толку от этого нет, т.к. скрипт не выполняется параллельно, а ждёт завершения этой функции.</p></blockquote></div><p>Юрий, поделись, как сделал.</p>]]></content>
			<author>
				<name><![CDATA[chessman]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25359</uri>
			</author>
			<updated>2012-12-03T08:07:29Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66433#p66433</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66398#p66398" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2012-12-02T14:09:03Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66398#p66398</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66321#p66321" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[vo1ty]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=28909</uri>
			</author>
			<updated>2012-12-01T08:39:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66321#p66321</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66312#p66312" />
			<content type="html"><![CDATA[<p>В общем, мне удалось вызвать функцию скрипта из другого потока, но толку от этого нет, т.к. скрипт не выполняется параллельно, а ждёт завершения этой функции.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2012-11-30T15:29:07Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66312#p66312</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66303#p66303" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2012-11-30T03:30:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66303#p66303</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[JScript: Многопоточность: [DynamicWrapperX] WINAPI и CreateTheard]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=66300#p66300" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[vo1ty]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=28909</uri>
			</author>
			<updated>2012-11-29T19:48:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=66300#p66300</id>
		</entry>
</feed>
