processfree
Задание параллельного выполнения задач в разных потоках с уничтожением потоков в конце
Синтаксис
processfree
<задача 1>
...
<задача 2>
end;Описание
Здание параллельного исполнения с ожиданием результатов всех операций с автоматическим
уничтожением потоков после их отработки (для однократного режима).
processfree не возвращает управление пока все задачи, выполняемые
параллельно, не завершатся. Задачи задаются в виде обычных пользовательских функций без
параметров, но для них будут недоступны операции записи в глобальные переменные. Внутри
задач можно организовывать аналогичным образом подзадачи, которые будут выполняться
параллельно.
Рекомендации
Для чтения данных в постоянном режиме от сервера (например в главном скрипте видеокадра) следует использовать функцию asyncprocess - поскольку в этом случае постоянное создание и выполнение потоков нежелательно. Для однократной записи данных при выполнении действия внутри блока в асинхронном режиме следует использовать функцию asyncprocessfree, чтобы потоки самоуничтожились после выполнения операции.
При этом следует помнить: для секций process и asyncprocess потоки выполнения создаются в точке использования секции. То есть, например, если секция параллельного исполнения находится в графическом скрипте двух блоков, то для КАЖДОГО из этих блоков будут создаваться по N потоков, находящихся в режиме ожидания. Для таких случаев следует использовать секции с уничтожением потоков (asyncprocessfree, processfree) или же следует вынести секцию параллельного выполнения в функцию в скрипте головной страницы проекта. Альтернативой является создание потока в одном месте и использование очереди операций, заполняемой из блоков и выполняемой исполняющим потоком.
Пример
var connected1:boolean,
connected2:boolean;;
//Функция обработки соединения 1
procedure DoProcessConnection1
...
end;
//Функция обработки соединения 2
procedure DoProcessConnection2
...
end;
//Синхронная обработка соединений в отдельных потоках
processfree
DoProcessConnection1; //Подключение канала 1
DoProcessConnection2; //Подключение канала 2
end; //конец секции синхронной обработки, уничтожение потоковВ примере определяются пользовательские функции обработки соединения, после этого организуется параллельная обработка соединений в разных потоках. Секция не завершится, пока задачи подключения каналов не завершатся. По завершении обработки секции происходит уничтожение параллельных потоков.