![]() |
PIP 5.5.3
Platform-Independent Primitives
|
Thread class. More...
#include <pithread.h>

Public Types | |
| enum | Priority { piLowerst , piLow , piNormal , piHigh , piHighest } |
| Priority of thread. More... | |
Public Member Functions | |
| PIThread (void *data, ThreadFunc func, bool startNow=false, PISystemTime loop_delay={}) | |
| Contructs thread with custom data "data", external function "func" and main loop delay "loop_delay". | |
| PIThread (std::function< void()> func, bool startNow=false, PISystemTime loop_delay={}) | |
| Contructs thread with external function "func" and main loop delay "loop_delay". | |
| PIThread (bool startNow=false, PISystemTime loop_delay={}) | |
| Contructs thread with main loop delay "loop_delay". | |
| bool | start () |
| Start thread. | |
| bool | start (PISystemTime loop_delay) |
| Start thread. | |
| bool | start (ThreadFunc func) |
| Start thread. | |
| bool | start (ThreadFunc func, PISystemTime loop_delay) |
| Start thread. | |
| bool | start (std::function< void()> func) |
| Start thread. | |
| bool | start (std::function< void()> func, PISystemTime loop_delay) |
| Start thread. | |
| bool | startOnce () |
| Start thread without internal loop. More... | |
| bool | startOnce (ThreadFunc func) |
| Start thread without internal loop. More... | |
| bool | startOnce (std::function< void()> func) |
| Start thread without internal loop. | |
| bool | stopAndWait (PISystemTime timeout={}) |
| Stop thread and wait for finish. Returns false if timeout expired. | |
| void | setData (void *d) |
| Set common data passed to external function. | |
| void | setSlot (ThreadFunc func) |
| Set external function that will be executed after every run() | |
| void | setSlot (std::function< void()> func) |
| Set external function that will be executed after every run() | |
| void | setPriority (PIThread::Priority prior) |
| Set thread priority. | |
| void * | data () const |
| Returns common data passed to external function. | |
| PIThread::Priority | priority () const |
| Return thread priority. | |
| bool | isRunning () const |
| Return if thread is running. | |
| bool | isStopping () const |
| Return if thread is stopping. | |
| bool | waitForStart (PISystemTime timeout={}) |
| Wait for thread start. | |
| bool | waitForStart (int timeout_msecs) DEPRECATEDM("use waitForStart(PISystemTime)") |
| bool | waitForFinish (PISystemTime timeout={}) |
| Wait for thread finish. Returns false if timeout expired. | |
| bool | waitForFinish (int timeout_msecs) DEPRECATEDM("use waitForFinish(PISystemTime)") |
| void | needLockRun (bool need) |
| Set necessity of lock every run() with internal mutex. | |
| PIMutex & | mutex () const |
| Returns internal mutex. | |
| llong | tid () const |
| Returns thread ID. | |
Public Member Functions inherited from PIObject | |
| PIObject (const PIString &name=PIString()) | |
| Contructs PIObject with name "name". | |
| PIString | name () const |
| Returns object name. | |
| virtual const char * | className () const |
| Returns object class name. | |
| virtual const char * | parentClassName () const |
| Returns parent class name. | |
| bool | debug () const |
| Return if piCoutObj of this object is active. | |
| void | setName (const PIString &name) |
| Set object name. | |
| void | setDebug (bool debug) |
| Set object piCoutObj active. | |
| PIVariant | property (const char *name) const |
| Returns property with name "name". | |
| void | setProperty (const char *name, const PIVariant &value) |
| Set property with name "name" to "value". If there is no such property in object it will be added. | |
| bool | isPropertyExists (const char *name) const |
| Returns if property with name "name" exists. | |
| PIStringList | scopeList () const |
| Returns subclass scope of this object (including this class name) | |
| void | piDisconnect (const PIString &sig, PIObject *dest, void *ev_h) |
| Disconnect object from all connections with event name "sig", connected to destination object "dest" and handler "ev_h". | |
| void | piDisconnect (const PIString &sig, PIObject *dest) |
| Disconnect object from all connections with event name "sig", connected to destination object "dest". | |
| void | piDisconnect (const PIString &sig) |
| Disconnect object from all connections with event name "sig". | |
| bool | isPIObject () const |
| Returns if this is valid PIObject (check signature) | |
| template<typename T > | |
| bool | isTypeOf () const |
| Returns if this is valid PIObject subclass "T" (check signature and classname) | |
| template<typename T > | |
| T * | cast () const |
| Returns cast to T if this is valid subclass "T" (check by isTypeOf()) or "nullptr". | |
| void | callQueuedEvents () |
| Execute all posted events from CONNECTU_QUEUED connections. | |
| bool | maybeCallQueuedEvents () |
| Check if any CONNECTU_QUEUED connections to this object and execute them. More... | |
| void | deleteLater () |
| Mark object to delete. More... | |
| void | deleted (PIObject *o) |
| Raise before object delete. More... | |
Static Public Member Functions | |
| static void | runOnce (PIObject *object, const char *handler, const PIString &name=PIString()) |
| Call event handler "handler" of object "object" in separate thread. More... | |
| static void | runOnce (std::function< void()> func, const PIString &name=PIString()) |
| Call lambda expression "func" in separate thread. More... | |
Static Public Member Functions inherited from PIObject | |
| static void | piDisconnect (PIObject *src, const PIString &sig, PIObject *dest, void *ev_h) |
| Disconnect object "src" from all connections with event name "sig", connected to destination object "dest" and handler "ev_h". | |
| static void | piDisconnect (PIObject *src, const PIString &sig, PIObject *dest) |
| Disconnect object "src" from all connections with event name "sig", connected to destination object "dest". | |
| static void | piDisconnect (PIObject *src, const PIString &sig) |
| Disconnect object "src" from all connections with event name "sig". | |
| static PIObject * | findByName (const PIString &name) |
| Returns PIObject* with name "name" or 0, if there is no object found. | |
| static bool | isPIObject (const PIObject *o) |
| Returns if "o" is valid PIObject (check signature) | |
| template<typename T > | |
| static bool | isTypeOf (const PIObject *o) |
| Returns if "o" is valid PIObject subclass "T" (check signature and classname) | |
Protected Member Functions | |
| virtual void | begin () |
| Function executed once at the start of thread. | |
| virtual void | run () |
| Function executed at every "loop_delay" msecs until thread was stopped. | |
| virtual void | end () |
| Function executed once at the end of thread. | |
Protected Member Functions inherited from PIObject | |
| PIObject * | emitter () const |
| Returns PIObject* which has raised an event. This value is correct only in definition of some event handler. | |
| virtual void | propertyChanged (const char *name) |
| Virtual function executes after property with name "name" has been changed. | |
Handlers | |
| void | stop () |
| Stop thread. More... | |
| void | terminate () |
| Strongly stop thread. More... | |
| void | lock () const |
| Lock internal mutex. | |
| void | unlock () const |
| Unlock internal mutex. | |
Events | |
| void | started () |
| Raise on thread start. | |
| void | stopped () |
| Raise on thread stop. | |
Additional Inherited Members | |
Related Functions inherited from PIObject | |
| #define | piCoutObj |
| Macro used for conditional (piDebug && PIObject::debug()) output to PICout(StdOut) for subclasses of PIObject. | |
| #define | piCerrObj |
| Macro used for conditional (piDebug && PIObject::debug()) output to PICout(StdErr) for subclasses of PIObject. | |
| #define | PIOBJECT(name) |
| You should use this macro after class declaration to use EVENT and EVENT_HANDLER and correct piCoutObj output. | |
| #define | PIOBJECT_SUBCLASS(name, parent) |
| You should use this macro after class declaration to use EVENT and EVENT_HANDLER of parent class, and scopeList() | |
| #define | EVENT_HANDLER0(ret, name) ret name() |
| Declare event handler with name "name" and return type "ret", ret name() | |
| #define | EVENT_HANDLER1(ret, name, type0, var0) ret name(type0 var0) |
| Declare event handler with name "name" and return type "ret", ret name(type0 var0) | |
| #define | EVENT_HANDLER2(ret, name, type0, var0, type1, var1) ret name(type0 var0, type1 var1) |
| Declare event handler with name "name" and return type "ret", ret name(type0 var0, type1 var1) | |
| #define | EVENT_HANDLER3(ret, name, type0, var0, type1, var1, type2, var2) ret name(type0 var0, type1 var1, type2 var2) |
| Declare event handler with name "name" and return type "ret", ret name(type0 var0, type1 var1, type2 var2) | |
| #define | EVENT_HANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) ret name(type0 var0, type1 var1, type2 var2, type3 var3) |
| Declare event handler with name "name" and return type "ret", ret name(type0 var0, type1 var1, type2 var2, type3 var3) | |
| #define | EVENT_HANDLER EVENT_HANDLER0 |
| Synonym of EVENT_HANDLER0. | |
| #define | EVENT_VHANDLER0(ret, name) virtual ret name() |
| Declare virtual event handler with name "name" and return type "ret", virtual ret name() | |
| #define | EVENT_VHANDLER1(ret, name, type0, var0) virtual ret name(type0 var0) |
| Declare virtual event handler with name "name" and return type "ret", virtual ret name(type0 var0) | |
| #define | EVENT_VHANDLER2(ret, name, type0, var0, type1, var1) virtual ret name(type0 var0, type1 var1) |
| Declare virtual event handler with name "name" and return type "ret", virtual ret name(type0 var0, type1 var1) | |
| #define | EVENT_VHANDLER3(ret, name, type0, var0, type1, var1, type2, var2) virtual ret name(type0 var0, type1 var1, type2 var2) |
| Declare virtual event handler with name "name" and return type "ret", virtual ret name(type0 var0, type1 var1, type2 var2) | |
| #define | EVENT_VHANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3) |
| Declare virtual event handler with name "name" and return type "ret", virtual ret name(type0 var0, type1 var1, type2 var2,
type3 var3) | |
| #define | EVENT_VHANDLER EVENT_VHANDLER0 |
| Synonym of EVENT_VHANDLER0. | |
| #define | EVENT0(name) void name(); |
| Declare event with name "name", void name();. | |
| #define | EVENT1(name, type0, var0) void name(type0 var0); |
| Declare event with name "name", void name(type0 var0);. | |
| #define | EVENT2(name, type0, var0, type1, var1) void name(type0 var0, type1 var1); |
| Declare event with name "name", void name(type0 var0, type1 var1);. | |
| #define | EVENT3(name, type0, var0, type1, var1, type2, var2) void name(type0 var0, type1 var1, type2 var2); |
| Declare event with name "name", void name(type0 var0, type1 var1, type2 var2);. | |
| #define | EVENT4(name, type0, var0, type1, var1, type2, var2, type3, var3) void name(type0 var0, type1 var1, type2 var2, type3 var3); |
| Declare event with name "name", void name(type0 var0, type1 var1, type2 var2, type3 var3);. | |
| #define | EVENT EVENT0 |
| Synonym of EVENT0. | |
| #define | CONNECTU(src, event, dest, handler) |
| Connect event "event" from object "src" to event handler or event "handler" of object "dest". More... | |
| #define | CONNECTU_QUEUED(src, event, dest, handler, performer) |
| Connect event "event" from object "src" to event handler or event "handler" of object "dest". More... | |
| #define | CONNECTL(src, event, functor) |
| Connect event "event" from object "src" to lambda-expression "functor". More... | |
| #define | CONNECT0(ret, src, event, dest, handler) |
| Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists. More... | |
| #define | CONNECT1(ret, type0, src, event, dest, handler) |
| Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists. More... | |
| #define | CONNECT2(ret, type0, type1, src, event, dest, handler) |
| Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists. More... | |
| #define | CONNECT3(ret, type0, type1, type2, src, event, dest, handler) |
| Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists. More... | |
| #define | CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler) |
| Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists. More... | |
| #define | CONNECT CONNECT0 |
| Synonym of CONNECT0. More... | |
| #define | WEAK_CONNECT0(ret, src, event, dest, handler) |
| Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists. More... | |
| #define | WEAK_CONNECT1(ret, type0, src, event, dest, handler) |
| Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists. More... | |
| #define | WEAK_CONNECT2(ret, type0, type1, src, event, dest, handler) |
| Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists. More... | |
| #define | WEAK_CONNECT3(ret, type0, type1, type2, src, event, dest, handler) |
| Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists. More... | |
| #define | WEAK_CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler) |
| Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists. More... | |
| #define | WEAK_CONNECT WEAK_CONNECT0 |
| Synonym of WEAK_CONNECT0. More... | |
| #define | DISCONNECT0(ret, src, event, dest, handler) |
| piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest" | |
| #define | DISCONNECT1(ret, type0, src, event, dest, handler) |
| piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest" | |
| #define | DISCONNECT2(ret, type0, type1, src, event, dest, handler) |
| piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest" | |
| #define | DISCONNECT3(ret, type0, type1, type2, src, event, dest, handler) |
| piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest" | |
| #define | DISCONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler) |
| piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest" | |
| #define | DISCONNECT DISCONNECT0 |
| Synonym of DISCONNECT0. | |
| #define | HANDLER(handler) |
| Returns pointer to events handler "handler". | |
Thread class.
This class allow you exec your code in separate thread.
Multithreading allow you to execute code in several threads simultaneously. This trend allow you to use all cores of modern processors, but there are many dangers.
This class provide virtual functions begin(), run() and end(), which describes start, execution and finish work of some process. These functions executes in separate thread. When you execute start(int), PIThread create separate system thread and sequentially executes function begin(), run() and end(). You can reimplement each function and write your own code to execute.
Scheme of functions executing:
If no internal loop needed, you can use startOnce() method instead of start(int).
In this case scheme is next:
Unlike from directly using "pthread" or some similar you doesn`t need to write your own main thread cycle and sleep at every cycle end. PIThread make it for you, and your job is to set sleep value from contructor or when starting thread, and reimplement begin(), run() and end() functions.
Using with internal loop
Using without internal loop
You can use PIThread without subclassing by using "ThreadFunc" pointer that can be set from constructor or by overloaded function start(ThreadFunc func, int loop_delay). If "func" if not null this function will be executed after run().
ThreadFunc is any static function with format "void func(void * data)", or lambda expression with format [...]( ){...}. "Data" is custom data set from constructor or with setData() function.
Also you can connect to event started(), but in this case you should to white your thread main cycle, because this event raised only one time after thread start.
Using with internal loop
Using without internal loop
Using with lambda expression
Using with event
PIThread has inrternal mutex that can be locked and unlocked every run() if you set this flag with function needLockRun(true). Also you can access to this mutex by functions lock(), unlock() and mutex(). Using this functions outside of thread together with needLockRun(true) can defend your data.
| enum PIThread::Priority |
| bool PIThread::startOnce | ( | ) |
| bool PIThread::startOnce | ( | ThreadFunc | func | ) |
Start thread without internal loop.
Overloaded function. Set external function "func" before start.
false if thread already started or can`t start thread | void PIThread::stop | ( | ) |
Stop thread.
Mark thread to stop execution and wait for finish if "wait" is true. Thread can be stopped only outside of run() or external method.
true and any of thread function is busy forever. | void PIThread::terminate | ( | ) |
Strongly stop thread.
Stop execution of thread immediately.
|
inline |
Block until thread start within "timeout_msecs" or forever if "timeout_msecs" < 0
true if thread started less than timeout false if timeout is exceeded
|
inline |
Block until thread finish for "timeout_msecs" or forever if "timeout_msecs" < 0
true if thread finished less than timeout false if timeout is exceeded
|
static |
Call event handler "handler" of object "object" in separate thread.
This method create PIThread with name "name" and execute event handler "handler" of object "object" in this thread.
This PIThread automatically delete on function finish.
Call lambda expression "func" in separate thread.
This method create PIThread with name "name" and execute lambda expression "func" in this thread.
This PIThread automatically delete on function finish.
"func" shouldn`t have arguments.