Потоки

«КАСКАД Цифра» — это событийно-управляемая система. Если некоторая функция должна быть выполнена как результат какого-то события (например, изменение в значении атрибута точки данных), то связь между требуемым атрибутом точки данных и выполняемой функцией необходимо устанавливать в сценарии CTRL. Это достигается при помощи функции «dpConnect()».

Так как различные события, иногда происходящие одновременно, могут инициировать запуск различных функций, такие функции — также известные как функции обратного вызова или рабочие функции — выполняются параллельно в CTRL. Один экземпляр обрабатываемой таким образом функции называется поток.

Поток, таким образом, похож на самостоятельный процесс, т.е. обрабатывается «КАСКАД Цифра», как будто других активных потоков в это время нет. Следовательно, поток имеет свои собственные данные или область стека памяти, т.е. если некоторая функция обратного вызова, назовем ее «myCB», соединена «dpConnect()» с различными атрибутами точки данных, после чего исполняется, иногда параллельно, при изменении эти атрибутов локальные переменные в пределах «myCB» видны внутри или доступны только внутри потока, но не между ними.

«dpConnect()» не является единственным средством автоматического запуска или прерывания потоков «КАСКАД Цифра». Инженер-программист CTRL также имеет возможность запускать функции параллельно, используя startThread()/stopThread(). При этом используются вышеупомянутые условия к переменным.

ЗначокПРИМЕР

В примере ниже определена функция потока, после чего она выполняется в функции «main()» в качестве потока.

void myFunction()
{
int a;
for (a = 0; a < 10; a++)
    DebugN(getThreadId(), a);
}
main()
{
startThread(«myFunction»);/*запуск нового потока функции
     «myFunction»*/

startThread(«myFunction»);/*параллельное выполнение 2-го потока, при этом каждый
поток нумерует себя от 0 до 9 и выдает соответствующий
номер потока*/

}

Для функции, которая всегда выполняется в потоке, единственным способом сохранения значений в переменных, которые появляются снова в следующем потоке, является использование глобальных переменных сценария, т.е. переменных, которые объявлены за пределами всех функции и, таким образом, относятся к сценарию, а не к конкретному потоку.

Обрабатываемая в качестве автономного потока функция никогда не имеет каких-либо возвращаемых аргументов и, таким образом, должна быть объявлена как void. Связано это с тем, что функция вызова просто параллельно выполняет поток и не ждет его завершения. Таким образом, существует вероятность того, что функция вызова уже завершила его выполнение, в то время как поток, выполняемый этой функцией, все еще находится в работе. Это значит, что поток также не способен возвращать значения в вызывающую функцию.

Объявление функции, таким образом, должно иметь следующий вид:

void myFunction()

или, в сокращенном варианте

  • myFunction()

В каждом сценарии инициируется запуск, как минимум, одного потока, а именно того, который исполняет функцию «main()».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *