PIP  0.4.0_beta2
Platform-Independent Primitives
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
PIThread Class Reference

Thread class. More...

+ Inheritance diagram for PIThread:

Public Types

enum  Priority {
  piHighest, piHigh, piNormal, piLow,
  piLowerst
}
 Priority of thread. More...
 

Public Member Functions

 PIThread (void *data, ThreadFunc func, bool startNow=false, int timer_delay=-1)
 Contructs thread with custom data "data", external function "func" and main cycle delay "timer_delay".
 
 PIThread (bool startNow=false, int timer_delay=-1)
 Contructs thread with main cycle delay "timer_delay".
 
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 setPriority (PIThread::Priority prior)
 Set priority of thread.
 
PIThread::Priority priority () const
 Return priority of thread.
 
bool isRunning () const
 Return true if thread is running.
 
void needLockRun (bool need)
 Set necessity of lock every run with internal mutex.
 
PIMutexmutex ()
 Return internal mutex.
 
- 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.
 
bool debug () const
 Return if debug of this object is active.
 
void setName (const PIString &name)
 Set object name.
 
void setDebug (bool debug)
 Set object debug active.
 
const PIMap< PIString,
PIVariant > & 
properties () const
 Returns properties of the object.
 
int propertiesCount () const
 Returns properties count of the object.
 
PIVariant property (const PIString &name) const
 Returns property with name "name".
 
void setProperty (const PIString &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 PIString &name) const
 Returns if property with name "name" exists.
 

Protected Member Functions

virtual void begin ()
 Function executed once at the start of thread.
 
virtual void run ()
 Function executed at every "timer_delay" msecs until thread was stopped.
 
virtual void end ()
 Function executed once at the end of thread.
 
- Protected Member Functions inherited from PIObject
PIObjectemitter () const
 Returns PIObject* which has raised an event. This value is correct only in definition of some event handler.
 
virtual void propertyChanged (const PIString &name)
 Virtual function executes after property with name "name" has been changed.
 

Handlers

bool start (int timer_delay)
 Start thread. More...
 
bool start (ThreadFunc func, int timer_delay)
 Start thread. More...
 
bool startOnce ()
 Start thread without internal loop. More...
 
bool startOnce (ThreadFunc func)
 Start thread without internal loop. More...
 
void stop (bool wait)
 Stop thread. More...
 
void terminate ()
 Strongly stop thread. More...
 
bool waitForStart (int timeout_msecs)
 Wait for thread start. More...
 
bool waitForFinish (int timeout_msecs)
 Wait for thread finish. More...
 
void lock ()
 Lock internal mutex.
 
void unlock ()
 Unlock internal mutex.
 

Events

void started ()
 Raise on thread start.
 
void stopped ()
 Raise on thread stop.
 

Additional Inherited Members

- Static Public Member Functions inherited from PIObject
static void piDisconnect (PIObject *src, const PIString &sig)
 Disconnect object "src" from all connections with event name "sig".
 
static void piDisconnect (PIObject *src)
 Disconnect object "src" from all connections, i.e. all connections where object "src" is emitter.
 
static PIObjectfindByName (const PIString &name)
 Returns PIObject* with name "name" or 0, if there is no object found.
 

Detailed Description

Thread class.

This class allow you exec your code in separate thread.

Synopsis

Multithreading allow you to write program which will be executed 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(), 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:

event started();
while (isRunning()) {
run();
ThreadFunc();
msleep(timer_delay);
}
event stopped();
end();

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 without subclassing

You can use PIThread without subclassing by using "ThreadFunc" pointer that can be set from constructor or by overloaded function start(ThreadFunc func, int timer_delay). If "func" if not null this function will be executed as run(). ThreadFunc is any static function with format void func(void * data). "Data" is custom data set from constructor or with function setData().
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.

Locking

PIThread has inrternal mutex that can be locked and unlocked every run() if you set this flag with function needLockRun(bool). Also you can access to this mutex by functions lock(), unlock() and mutex(). Using this functions together with needLockRun(true) can guarantee one-thread access to some data.

Member Enumeration Documentation

Priority of thread.

Enumerator
piHighest 

Highest

piHigh 

High

piNormal 

Normal, default

piLow 

Low

piLowerst 

Lowest

Member Function Documentation

bool PIThread::start ( int  timer_delay = -1)

Start thread.

Start execution of run() in internal loop with "timer_delay" delay in milliseconds. If "timer_delay" <= 0 there is no delay in loop. Thread also exec external function set by setSlot() if it`s not null

Returns
false if thread already started or can`t start thread
bool PIThread::start ( ThreadFunc  func,
int  timer_delay = -1 
)
inline

Start thread.

Overloaded function. Set external function "func" before start

Returns
false if thread already started or can`t start thread
bool PIThread::startOnce ( )

Start thread without internal loop.

Start execution of run() once. Thread also exec external function set by setSlot() if it`s not null

Returns
false if thread already started or can`t start thread
bool PIThread::startOnce ( ThreadFunc  func)
inline

Start thread without internal loop.

Overloaded function. Set external function "func" before start

Returns
false if thread already started or can`t start thread
void PIThread::stop ( bool  wait = false)
inline

Stop thread.

Stop execution of thread and wait for it finish if "wait" is true. This function can block for infinite time if "wait" is true and any of thread function is busy forever

void PIThread::terminate ( )

Strongly stop thread.

Stop execution of thread immediately

bool PIThread::waitForStart ( int  timeout_msecs = -1)

Wait for thread start.

This function block until thread finish for "timeout_msecs" or forever if "timeout_msecs" < 0

Returns
false if timeout is exceeded
bool PIThread::waitForFinish ( int  timeout_msecs = -1)

Wait for thread finish.

This function block until thread start for "timeout_msecs" or forever if "timeout_msecs" < 0

Returns
false if timeout is exceeded