startThread()

Starts a function in a new thread.

Synopsis

int startThread(string|function_ptr func [, anytype arg1...]);

int startThread(class object, string|function_ptr func, args ...);

Parameters

Parameter Description
object An object of a Control++ class.
funcName

Name of the callback function ("work function") that is called when data point values change.

Or

The name of a function pointer to the work function (callback function).

arg1, arg2, ... arguments to be transferred

Return value

If the function could not be started, -1 is returned. If the function was started successfully and the thread stops immediately as well as in all other cases startThread() returns the thread identification number ThreadId (>= 0).

Errors

incorrect/invalid argument, for example, if the function to be started does not exist.

Description

Starts the function funcName as a new, parallel thread. Arguments can be transferred to the function with arg1, arg2, ... .

The function to be started can only be void, i.e. may have no return values.

EXAMPLE

Starts "test as a new thread.

main()
{
  startThread("test");
}
void test()
{

//...
}

EXAMPLE

Calls the function "myWorkFunction" and starts it a s a new thread.

main()
{
  startThread("myWorkFunction", TRUE, 3);




  /* "3", "2" and "1" are returned. The time between the output is 1 second. */
}
void myWorkFunction(bool bNeedWait, int iIterations)
{
  while(iIterations > 0)
  {
    Debug("Iteration: ",iIterations--);
    if(bNeedWait)
    {
      delay(1);
    }
  }
}

EXAMPLE

In this example the startThread() function starts a static function from a class as well as a non-static function from a class. Both the function "work"and the function workStatic are each started in a thread. Both of the functions set a data point value and output the value.

class DpCon
{
  public void work(string dp, float value)
  {
    dpSet(dp, value);
    DebugTN(value);
  }

  public static void workStatic(string dp, float value)
  {
    dpSet(dp, value);
    DebugTN(value);
  }
};



main()
{

  DpCon threadObj;
  startThread(threadObj,DpCon::work,"ExampleDP_Arg1.",100);
  startThread(DpCon::workStatic,"ExampleDP_Arg2.",200);
}

If you start the threads of the example above in reverse order:

 startThread(DpCon::workStatic,"ExampleDP_Arg2.",22);
 startThread(threadObj,DpCon::work,"ExampleDP_Arg1.",21);

the start of the thread "work" does not work since the main() function is already executed and the scope ends.

Assignment

Threads

Availability

CTRL