Thread Utility Manual

About

The Cinema 4D Cinema API provides various functions to handle threads and thread related tasks.

Warning
For Maxon API threading utilities see Threads Manual.

Utility Functions

Various tasks should only be performed from the main thread. For example any GUI interaction or any change of the currently active BaseDocument must only happen from the main thread. To make sure that such code is only executed in the main thread the following functions can be used:

  • GeIsMainThread(): Returns true if the code is running in the context of the main thread.
  • GeIsMainThreadAndNoDrawThread(): Returns true if the code is running in the context of the main thread and if the main thread does not execute any viewport drawing.
// This example shows how a context less function can check
// if it is allowed to edit the active document.
static maxon::Result<void> SetActiveDocumentTime(const Float time)
{
// check if the function is called
// from within the main thread
{
return maxon::IllegalStateError(MAXON_SOURCE_LOCATION);
}
BaseDocument* const doc = GetActiveDocument();
if (doc == nullptr)
return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
doc->SetTime(BaseTime(time));
return maxon::OK;
}
return OK
Definition: apibase.h:2740
#define MAXON_SOURCE_LOCATION
Definition: memoryallocationbase.h:69
#define CriticalStop(...)
Definition: debugdiagnostics.h:231
BaseDocument * GetActiveDocument()
maxon::Float Float
Definition: ge_sys_math.h:57
void EventAdd(EVENT eventflag=EVENT::NONE)
Bool GeIsMainThreadAndNoDrawThread()
const char * doc
Definition: pyerrors.h:226

Running Systems

Note
CheckIsRunning() does not check if the current code is running within the context of the checked task. See IdentifyThread() above.
// This example checks if the external render thread is running.
// If so it should stop.
// check if the external renderer ("Picture Viewer") is running
{
}
EXTERNALRENDERING
External rendering.
Definition: ge_prepass.h:3
#define BACKGROUNDHANDLER_TYPECLASS_C4D
Cinema 4D background handler type class.
Definition: ge_prepass.h:4903
RENDEREXTERNAL
External render.
Definition: ge_prepass.h:3
Bool CheckIsRunning(CHECKISRUNNING type)
Bool GeStopBackgroundThreads(Int32 typeclass, BACKGROUNDHANDLERFLAGS flags, BaseThread *thread)

Get Threads

These functions are used to obtain certain threads:

  • GeGetCurrentThreadId(): Returns the unique ID for the current thread.
  • GeGetCurrentThread(): Returns the current BaseThread. This BaseThread can be passed to functions that require a BaseThread argument to check for stop conditions.
  • GeGetDummyThread(): Returns a dummy thread. This may be used when a BaseThread argument must be set.
  • GeGetEscTestThread(): Returns a thread for escape key testing. This may be used when a BaseThread argument must be set.
// This example will execute the while loop until the "Esc" key is pressed.
BaseThread* const escThread = GeGetEscTestThread();
if (escThread == nullptr)
return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
// execute the loop until the escThread signals to stop
while (!escThread->TestBreak())
{
DoSomething();
}
BaseThread * GeGetEscTestThread()
Definition: c4d_thread.h:208

Further Reading