<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://sfsys.ru/index.php?action=history&amp;feed=atom&amp;title=Mutex.InterProcessExecuteFunction</id>
	<title>Mutex.InterProcessExecuteFunction - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://sfsys.ru/index.php?action=history&amp;feed=atom&amp;title=Mutex.InterProcessExecuteFunction"/>
	<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Mutex.InterProcessExecuteFunction&amp;action=history"/>
	<updated>2026-04-04T15:06:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>http://sfsys.ru/index.php?title=Mutex.InterProcessExecuteFunction&amp;diff=4471&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Mutex.InterProcessExecuteFunction&amp;diff=4471&amp;oldid=prev"/>
		<updated>2022-11-18T09:38:30Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 09:38, 18 November 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://sfsys.ru/index.php?title=Mutex.InterProcessExecuteFunction&amp;diff=4470&amp;oldid=prev</id>
		<title>1&gt;Admin at 11:00, 8 October 2022</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Mutex.InterProcessExecuteFunction&amp;diff=4470&amp;oldid=prev"/>
		<updated>2022-10-08T11:00:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 11:00, 8 October 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l28&quot; &gt;Line 28:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 28:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Скорость исполнения функций с простыми аргументами достаточно высока (не сильно уступает прямому исполнению, см. ниже). Однако вызов [[Mutex.InitializeSeparateProcess|InitializeSeparateProcess]] может занимать достаточно долгое время, поэтому, выгодно, однажды инициализировав, использовать подчиненный процесс многократно. Кроме того, при передаче объемных аргументов (большие таблицы или списки, длинные строки) исполнение также может замедляться из-за времени экспорта-импорта.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Скорость исполнения функций с простыми аргументами достаточно высока (не сильно уступает прямому исполнению, см. ниже). Однако вызов [[Mutex.InitializeSeparateProcess|InitializeSeparateProcess]] может занимать достаточно долгое время, поэтому, выгодно, однажды инициализировав, использовать подчиненный процесс многократно. Кроме того, при передаче объемных аргументов (большие таблицы или списки, длинные строки) исполнение также может замедляться из-за времени экспорта-импорта.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Для увеличения скорости исполнения выгоднее использовать функции, которые выполняют большую, более длительную работу, по сравнению с функциями, которые завершаются очень быстро.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Для увеличения скорости исполнения выгоднее использовать функции, которые выполняют большую, более длительную работу, по сравнению с функциями, которые завершаются очень быстро.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Некоторые визуальные функции и функции диалога, типа [[Message]], [[Box]], [[AskQuestion]] поддерживаются (окно будет выведено на экране, вызывавшей стороны, после ответа пользователя, если он подразумевается, результат будет передан на удаленную сторону). Если функция не поддерживается, она будет вести себя так, как будто пользователь нажал на отмену. В будущем могут быть поддержаны функции, которые ранее не поддерживались.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Удаленная сторона может использовать некоторые функции для взаимодействия с локальной стороной (к примеру, функцию [[InterProcessServerTimeout]]).&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Синтаксис ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Синтаксис ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>1&gt;Admin</name></author>
		
	</entry>
	<entry>
		<id>http://sfsys.ru/index.php?title=Mutex.InterProcessExecuteFunction&amp;diff=4402&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Mutex.InterProcessExecuteFunction&amp;diff=4402&amp;oldid=prev"/>
		<updated>2022-08-09T09:46:51Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 09:46, 9 August 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://sfsys.ru/index.php?title=Mutex.InterProcessExecuteFunction&amp;diff=4401&amp;oldid=prev</id>
		<title>1&gt;Admin: /* Примеры */</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Mutex.InterProcessExecuteFunction&amp;diff=4401&amp;oldid=prev"/>
		<updated>2022-08-05T10:05:35Z</updated>

		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Примеры&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{infobox function&lt;br /&gt;
|name=InterProcessExecuteFunction&lt;br /&gt;
|object=[[Функции общего назначения#Объект семафор|Семафор]]&lt;br /&gt;
|caption=Работа с подчиненными процессами&lt;br /&gt;
|type=1&lt;br /&gt;
|status=2&lt;br /&gt;
|db=0&lt;br /&gt;
|exception=Невозможно превратить в строку, системная ошибка&lt;br /&gt;
|visual=0}}&lt;br /&gt;
{{HeadLinks|&lt;br /&gt;
* [[Main_Page|Начальная страница]]&lt;br /&gt;
* [[Общее_описание_языка|Общее описание]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Функции общего назначения#Объект семафор|Семафор]]}}&lt;br /&gt;
Функция вызывает исполнение указанной функции в подчиненном процессе, созданном ранее функцией [[Mutex.InitializeSeparateProcess|InitializeSeparateProcess]], и возвращает ошибку или результат ее исполнения. При вызове в функцию разрешено передавать объекты произвольного вида, изменяемые аргументы-переменные также могут быть обновлены после исполнения.&lt;br /&gt;
&lt;br /&gt;
Функции, выполняющиеся в отдельных процессах, могут использоваться для изолирования кода исполнения, к примеру, когда внешняя библиотека (или OLE объект) работают со сбоями и могут испортить системную память, тем самым вызывая завершение с ошибкой всего процесса клиента. После инициализации, процесс будет находиться в режиме ожидания исполнения, клиент же может периодически вызывать функцию InterProcessExecuteFunction для исполнения программы в ожидающем процессе. После удаления объекта семафора из системы, подчиненный процесс также будет завершен. Исполнение всегда происходит в синхронном режиме (функция ожидает окончания исполнения удаленной функции и только после этого возвращает результат), асинхронный режим для большей гибкости при работе планируется в будущем.&lt;br /&gt;
&lt;br /&gt;
При работе с вызовами функций в подчиненных процессах необходимо знать:&lt;br /&gt;
* Все аргументы копируются в подчиненный процесс с помощью экспорта и импорта, поэтому, они не будут связаны с оригинальными переменными и объектами (подчиненный процесс имеет собственное адресное пространство в памяти). В виде аргументов позволяется использовать все простые и сложные типы (строки, числа, даты, объекты базы данных, списки, таблицы, электронные таблицы), однако:&lt;br /&gt;
** Большие по объему аргументы (к примеру, электронные таблицы) могут замедлить исполнение функций, из-за затрат времени на экспорт/импорт. Рекомендуется использовать простые аргументы или легкие списки и таблицы.&lt;br /&gt;
** Электронные таблицы, таблицы, списки, связанные с формой, в подчиненном процессе больше не будут с ней связаны. Таблицы, адресующие строчные части объектов базы данных, больше не будут их адресовать.&lt;br /&gt;
** Все изменения в сложных объектах (списках, таблицах) не будут отражаться на оригинальных таблицах в основном процессе. Если список передается, как аргумент-переменная с пометкой ByRef, после выполнения функции, оригинальный список в переменной будет заменен копией из подчиненного процесса, со всеми возможными изменениями. &lt;br /&gt;
** Передача объектов форм не имеет смысла, так как подчиненный поток всегда работает в консольном режиме.&lt;br /&gt;
** Объекты типа ''ini'', ''memoryrecord'', ''file'', ''picture'', ''ip'', ''ole'', ''dbf'', ''lib'', ''exdb'', ''xml'', ''query'', ''tempdb'' и др. не передаются в подчиненные процессы. Если необходимо, к примеру, передать картинку, необходимо сначала экспортировать ее в строку.&lt;br /&gt;
** Локальные переменные модуля, в котором находится исполняемая функция, не будут доступны при исполнении. Используйте переменные глобальных модулей.&lt;br /&gt;
** Все передаваемые объекты базы данных будут перенесены на сторону подчиненного процесса незагруженными, для работы с ними системе придется снова загрузить их из базы данных, что может занять дополнительное время. Измененные и новые несохраненные объекты не имеет смысла передавать в подчиненные процессы, все изменения будут утеряны.&lt;br /&gt;
* Скорость исполнения функций с простыми аргументами достаточно высока (не сильно уступает прямому исполнению, см. ниже). Однако вызов [[Mutex.InitializeSeparateProcess|InitializeSeparateProcess]] может занимать достаточно долгое время, поэтому, выгодно, однажды инициализировав, использовать подчиненный процесс многократно. Кроме того, при передаче объемных аргументов (большие таблицы или списки, длинные строки) исполнение также может замедляться из-за времени экспорта-импорта.&lt;br /&gt;
* Для увеличения скорости исполнения выгоднее использовать функции, которые выполняют большую, более длительную работу, по сравнению с функциями, которые завершаются очень быстро.&lt;br /&gt;
&lt;br /&gt;
== Синтаксис ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
{{Grey|Mutex.}}'''InterProcessExecuteFunction'''(''&amp;lt;Имя функции (STRING)&amp;gt;''{{OptionalByRef|,&amp;lt;Аргумент 1&amp;gt;,&amp;lt;Аргумент 2&amp;gt;...}}):''&amp;lt;Результат исполнения функции&amp;gt;''&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== Аргументы ====&lt;br /&gt;
* &amp;lt;code&amp;gt;''&amp;lt;Имя функции (STRING)&amp;gt;''&amp;lt;/code&amp;gt; - Аргумент задает имя функции локального модуля, переданного процессу в момент его инициализации или глобального модуля. Если функция не найдена, будет вызвано исключение.&lt;br /&gt;
* &amp;lt;code&amp;gt;''&amp;lt;Аргумент ?&amp;gt;''&amp;lt;/code&amp;gt; - {{ByRef}} {{Optional}} Аргументы, передаваемые исполняемой функции. Аргументы с типом ByRef будут скопированы назад после окончания исполнения, если функция не вызвала исключения.&lt;br /&gt;
&lt;br /&gt;
==== Возвращаемое значение ====&lt;br /&gt;
Возвращает результат исполнения функции в подчиненном процессе, если при исполнении, функция не вызвала исключения.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Пример оценивает разницу в скорости прямого исполнения и исполнения функции в подчиненном приложении с простыми и сложными аргументами&lt;br /&gt;
&lt;br /&gt;
  Function Сложение(Переменная,Переменная2)&lt;br /&gt;
    Result:=Переменная+Переменная2;&lt;br /&gt;
  EndFunction&lt;br /&gt;
&lt;br /&gt;
  Function ВозвратитьСписок(ДлинныйСписок)&lt;br /&gt;
    Result:=ДлинныйСписок;&lt;br /&gt;
  EndFunction&lt;br /&gt;
&lt;br /&gt;
//Заполним длинный список вещественными аргументами&lt;br /&gt;
ДлинныйСписок:=List.Create();&lt;br /&gt;
For i:=1 To 10000 Do&lt;br /&gt;
  ДлинныйСписок.Add(i/3);&lt;br /&gt;
EndDo;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ProfilerClear();&lt;br /&gt;
ProfilerStart();&lt;br /&gt;
аПроцесс:=Mutex.InitializeSeparateProcess();&lt;br /&gt;
&lt;br /&gt;
//10000 вызовов простой функции&lt;br /&gt;
For i:=1 To 10000 Do&lt;br /&gt;
  Сложение(i,i);&lt;br /&gt;
  аПроцесс.InterProcessExecuteFunction(&amp;quot;Сложение&amp;quot;,i,i);&lt;br /&gt;
EndDo;&lt;br /&gt;
&lt;br /&gt;
//100 вызовов функции с длинными аргументом&lt;br /&gt;
For i:=1 To 100 Do&lt;br /&gt;
  ДлинныйСписок:=ВозвратитьСписок(ДлинныйСписок);&lt;br /&gt;
  ДлинныйСписок:=аПроцесс.InterProcessExecuteFunction(&amp;quot;ВозвратитьСписок&amp;quot;,ДлинныйСписок);&lt;br /&gt;
EndDo;&lt;br /&gt;
&lt;br /&gt;
ProfilerStop();&lt;br /&gt;
debugbreak;&lt;br /&gt;
&lt;br /&gt;
Message(&amp;quot;Done!&amp;quot;);&lt;br /&gt;
//Для i7, конечные результаты исполнения каждого блока:&lt;br /&gt;
//Сложение(i,i)                                           -- 27.63 мс. (10000)&lt;br /&gt;
//аПроцесс.InterProcessExecuteFunction(&amp;quot;Сложение&amp;quot;,i,i)    -- 575.74 мс. (10000)&lt;br /&gt;
//ДлинныйСписок:=ВозвратитьСписок(ДлинныйСписок)          -- 0.418 мс. (100)&lt;br /&gt;
//ДлинныйСписок:=аПроцесс.InterProcessExecuteFunction...  -- 4.00 с. (100)&lt;br /&gt;
//Выводы:&lt;br /&gt;
//Потеря времени, при вызовах простых функций на коммуникации между процессами может составлять около (575.74-27.63)/10000 мс., т.е., около 54 микросекунд. &lt;br /&gt;
//Такая потеря на практике не будет сказываться на скорости исполнения, даже если функция очень короткая и выполняется очень быстро. &lt;br /&gt;
//Для медленных же функций, уменьшением в скорости исполнения можно пренебречь.&lt;br /&gt;
//Использование объемных аргументов (список из 10000 вещественных чисел экспортируется достаточно долгое время, в данном случае, он должен быть и экспортирован и импортирован, &lt;br /&gt;
//  так как функция возвращает его в результате исполнения) будет очень сильно замедлять исполнение. В этом случае потеря времени может составлять &lt;br /&gt;
//  (4000-0.418)/100 около 40 миллисекунд (примерно в 1000 раз больше, чем в первом случае), для часто исполняемых функций, такую задержку уже необходимо учитывать.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>1&gt;Admin</name></author>
		
	</entry>
</feed>