<?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=Template%3A%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F%D0%BC%D0%B8</id>
	<title>Template:Пример работы с событиями - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://sfsys.ru/index.php?action=history&amp;feed=atom&amp;title=Template%3A%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F%D0%BC%D0%B8"/>
	<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Template:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F%D0%BC%D0%B8&amp;action=history"/>
	<updated>2026-04-04T12:05:56Z</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=Template:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F%D0%BC%D0%B8&amp;diff=3732&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Template:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F%D0%BC%D0%B8&amp;diff=3732&amp;oldid=prev"/>
		<updated>2021-02-07T06:56: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 06:56, 7 February 2021&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=Template:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F%D0%BC%D0%B8&amp;diff=3731&amp;oldid=prev</id>
		<title>Admin: Created page with &quot;&lt;pre&gt; //Пример показывает простой способ синхронизации между двумя потоками, первый поток получае...&quot;</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=Template:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F%D0%BC%D0%B8&amp;diff=3731&amp;oldid=prev"/>
		<updated>2019-09-18T09:53:13Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;pre&amp;gt; //Пример показывает простой способ синхронизации между двумя потоками, первый поток получае...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
//Пример показывает простой способ синхронизации между двумя потоками, первый поток получает внешние запросы, а второй поток обрабатывает их,&lt;br /&gt;
//  и передает ответ назад в первый поток, который пересылает ответ во внешний источник&lt;br /&gt;
//Использование событий позволяет выполнить запрос без каких либо пауз (какие появлялись бы при использовании функции Sleep внутри цикла)&lt;br /&gt;
//Пример использует 3 события:&lt;br /&gt;
//  * собВнешниеДанныеПоступили -- событие устанавливается в момент поступления внешних данных (механизм здесь не показан, он может быть любым -- событие TCP или внешнее устройство)&lt;br /&gt;
//  * собЗапросНаОбработку -- событие, которое устанавливает первый поток, когда он получил новые внешние данные и требуется передать их второму потоку на работку&lt;br /&gt;
//                            второй поток находится в ожидании этого события&lt;br /&gt;
//  * собДанныеОбработаны -- событие, которое устанавливает второй поток, когда он обработал данные, полученные от первого потока&lt;br /&gt;
&lt;br /&gt;
//Фрагмент инициализации, происходящий до рабочего цикла&lt;br /&gt;
собВнешниеДанныеПоступили:=Mutex.CreateEvent();&lt;br /&gt;
собЗапросНаОбработку:=Mutex.CreateEvent();&lt;br /&gt;
собДанныеОбработаны:=Mutex.CreateEvent();&lt;br /&gt;
&lt;br /&gt;
//Очереди данных и обработанных данных&lt;br /&gt;
спДанные:=List.Create();&lt;br /&gt;
спРезультат:=List.Create();&lt;br /&gt;
SetMultiThreaded(спДанные);&lt;br /&gt;
SetMultiThreaded(спРезультат);&lt;br /&gt;
&lt;br /&gt;
aList:=List.Create();&lt;br /&gt;
aList.SetByName(&amp;quot;ЗапросНаОбработку&amp;quot;,собЗапросНаОбработку);&lt;br /&gt;
aList.SetByName(&amp;quot;ДанныеОбработаны&amp;quot;,собДанныеОбработаны);&lt;br /&gt;
aList.SetByName(&amp;quot;Данные&amp;quot;,спДанные);&lt;br /&gt;
aList.SetByName(&amp;quot;Результат&amp;quot;,спРезультат);&lt;br /&gt;
//Модуль не будет иметь формы, будет выполняться в фоне&lt;br /&gt;
LoadModule(0,&amp;quot;Modules\FreeForms\СпециальныеОбработки\ОбработчикСобытий&amp;quot;,aList,,&amp;quot;Module&amp;quot;,&amp;quot;Form&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
спСобытия:=List.Create(собВнешниеДанныеПоступили,собДанныеОбработаны);&lt;br /&gt;
//Основной цикл обработки данных&lt;br /&gt;
While 1 Do&lt;br /&gt;
  //Другая работа в цикле, проверка условия выхода из цикла и окончания работы&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  //Ожидание получения или отсылки&lt;br /&gt;
  aNum:=Mutex.WaitForEvents(спСобытия,250);&lt;br /&gt;
&lt;br /&gt;
  If aNum=1 Then&lt;br /&gt;
    //Поступили данные из внешнего источника, получим данные&lt;br /&gt;
    //Возможно здесь необходимо проверить количество данных в очереди (спДанные.Size()) и, при переполнении, отказать в получении этих данных&lt;br /&gt;
    аДанные:=...&lt;br /&gt;
&lt;br /&gt;
    LockObject(спДанные);&lt;br /&gt;
    Try&lt;br /&gt;
      //Добавим данные в список данных, использование LockObject здесь не обязательно, однако, если кроме Add, будут использоваться&lt;br /&gt;
      //  другие функции для работы с спДанные, LockObject будет необходим. LockObject здесь использован для универсальности примера.&lt;br /&gt;
      спДанные.Add(аДанные);&lt;br /&gt;
    Finally&lt;br /&gt;
      UnlockObject(спДанные);&lt;br /&gt;
    EndTry;&lt;br /&gt;
    //Сигнал второму потоку о наличии данных&lt;br /&gt;
    собЗапросНаОбработку.SignalEvent();&lt;br /&gt;
  ElseIf aNum=2 Then&lt;br /&gt;
    While спРезультат.Size()&amp;gt;0 Do&lt;br /&gt;
      LockObject(спРезультат);&lt;br /&gt;
      Try&lt;br /&gt;
        //Использование LockObject здесь не обязательно, так как другой поток только добавляет данные в спРезультат в конец списка.&lt;br /&gt;
        //  LockObject здесь использован для универсальности примера.&lt;br /&gt;
        аРезультат:=спРезультат.Get(1);&lt;br /&gt;
        спРезультат.Remove(1);&lt;br /&gt;
      Finally&lt;br /&gt;
        UnlockObject(спРезультат);&lt;br /&gt;
      EndTry;&lt;br /&gt;
      &lt;br /&gt;
      //Осуществим отправку данных аРезультат&lt;br /&gt;
      ...&lt;br /&gt;
    EndDo;    &lt;br /&gt;
  EndIf;&lt;br /&gt;
EndDo;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Данный кусок кода располагается в обработке Modules\FreeForms\СпециальныеОбработки\ОбработчикСобытий&lt;br /&gt;
Function OnOpen()&lt;br /&gt;
  Result:=0;&lt;br /&gt;
  If TypeStr(Param)&amp;lt;&amp;gt;&amp;quot;LIST&amp;quot; Then&lt;br /&gt;
    Exit;&lt;br /&gt;
  EndIf;&lt;br /&gt;
  собЗапросНаОбработку:=aList.GetByName(&amp;quot;ЗапросНаОбработку&amp;quot;);&lt;br /&gt;
  собДанныеОбработаны:=aList.GetByName(&amp;quot;ДанныеОбработаны&amp;quot;);&lt;br /&gt;
  спДанные:=aList.GetByName(&amp;quot;Данные&amp;quot;);&lt;br /&gt;
  спРезультат:=aList.GetByName(&amp;quot;Результат&amp;quot;);&lt;br /&gt;
  //Основной цикл обработки данных&lt;br /&gt;
  While 1 Do&lt;br /&gt;
    //Проверка на окончание работы&lt;br /&gt;
    ...&lt;br /&gt;
    &lt;br /&gt;
    If собЗапросНаОбработку.WaitForEvent(250)=1 Then&lt;br /&gt;
      While спДанные.Size()&amp;gt;0 Do&lt;br /&gt;
        LockObject(спДанные);&lt;br /&gt;
        Try&lt;br /&gt;
          //Использование LockObject здесь не обязательно, так как другой поток только добавляет данные в спДанные в конец списка.&lt;br /&gt;
          //  LockObject здесь использован для универсальности примера.&lt;br /&gt;
          аДанные:=спДанные.Get(1);&lt;br /&gt;
          спДанные.Remove(1);&lt;br /&gt;
        Finally&lt;br /&gt;
          UnlockObject(спДанные);&lt;br /&gt;
        EndTry;&lt;br /&gt;
      &lt;br /&gt;
        //Обработаем данные аДанные и создадим результат аРезультат&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
        //Добавим результат в очередь результатов&lt;br /&gt;
        LockObject(спРезультат);&lt;br /&gt;
        Try&lt;br /&gt;
          //Использование LockObject здесь не обязательно, так как единственная функция Add имеет свой механизм блокирования.&lt;br /&gt;
          //  LockObject здесь использован для универсальности примера.&lt;br /&gt;
          спРезультат.Add(аРезультат);&lt;br /&gt;
        Finally&lt;br /&gt;
          UnlockObject(спРезультат);&lt;br /&gt;
        EndTry;&lt;br /&gt;
&lt;br /&gt;
        //Сообщим первому потоку, что появился новый результат&lt;br /&gt;
        собДанныеОбработаны.SignalEvent();&lt;br /&gt;
      EndDo;&lt;br /&gt;
    EndIf;&lt;br /&gt;
  EndDo;&lt;br /&gt;
EndFunction&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
</feed>