PIP 5.6.1
Platform-Independent Primitives
Открытые типы | Открытые члены | Открытые статические члены | Защищенные члены | Полный список членов класса
Класс PIThread

Объект потока, выполняющий работу в отдельном системном потоке. Подробнее...

#include <pithread.h>

Граф наследования:PIThread:
Inheritance graph
[см. легенду]

Открытые типы

enum  Priority {
  piLowerst , piLow , piNormal , piHigh ,
  piHighest
}
 Подсказка приоритета потока. Подробнее...
 

Открытые члены

 PIThread (void *data, ThreadFunc func, bool startNow=false, PISystemTime loop_delay={})
 Создает поток с пользовательскими данными, обратным вызовом и необязательным немедленным запуском.
 
 PIThread (std::function< void()> func, bool startNow=false, PISystemTime loop_delay={})
 Создает поток с обратным вызовом без пользовательских данных.
 
 PIThread (bool startNow=false, PISystemTime loop_delay={})
 Создает поток для наследования с необязательной задержкой цикла.
 
virtual ~PIThread ()
 Уничтожает объект потока. Если поток еще работает, при уничтожении выполняется принудительное завершение.
 
bool start ()
 Запускает поток с сохраненными обратным вызовом и задержкой цикла.
 
bool start (PISystemTime loop_delay)
 Сохраняет новую задержку цикла и запускает поток.
 
bool start (ThreadFunc func)
 Сохраняет обратный вызов и запускает поток.
 
bool start (ThreadFunc func, PISystemTime loop_delay)
 Сохраняет обратный вызов и задержку цикла, затем запускает поток.
 
bool start (std::function< void()> func)
 Сохраняет лямбда-обратный вызов и запускает поток.
 
bool start (std::function< void()> func, PISystemTime loop_delay)
 Сохраняет лямбда-обратный вызов и задержку цикла, затем запускает поток.
 
bool startOnce ()
 Запускает одноразовый поток без повторяющегося цикла. Подробнее...
 
bool startOnce (ThreadFunc func)
 Сохраняет обратный вызов и запускает одноразовое выполнение. Подробнее...
 
bool startOnce (std::function< void()> func)
 Сохраняет лямбда-обратный вызов и запускает одноразовое выполнение.
 
bool stopAndWait (int timeout_ms) DEPRECATEDM("use stopAndWait(PISystemTime)")
 Устаревшая перегрузка stopAndWait(), принимающая миллисекунды.
 
bool stopAndWait (PISystemTime timeout={})
 Запрашивает остановку и ожидает завершения потока. Возвращает false, если таймаут истек.
 
void setData (void *d)
 Устанавливает указатель данных, передаваемый в обратные вызовы ThreadFunc.
 
void setSlot (ThreadFunc func)
 Устанавливает обратный вызов, выполняемый после каждого прохода run().
 
void setSlot (std::function< void()> func)
 Устанавливает лямбда-обратный вызов, выполняемый после каждого прохода run().
 
void setPriority (PIThread::Priority prior)
 Устанавливает подсказку приоритета. Если поток уже работает, применяет ее немедленно.
 
void * data () const
 Возвращает указатель данных, передаваемый в обратные вызовы ThreadFunc.
 
PIThread::Priority priority () const
 Возвращает настроенную подсказку приоритета.
 
bool isRunning () const
 Возвращает, выполняется ли поток в данный момент.
 
bool isStopping () const
 Возвращает, был ли запрошен останов и поток еще завершает работу.
 
bool waitForStart (PISystemTime timeout={})
 Ожидает запуска потока. Возвращает false, если таймаут истек раньше.
 
bool waitForStart (int timeout_msecs) DEPRECATEDM("use waitForStart(PISystemTime)")
 Устаревшая перегрузка waitForStart(), принимающая миллисекунды. Подробнее...
 
bool waitForFinish (PISystemTime timeout={})
 Ожидает завершения потока. Возвращает false, если таймаут истек раньше.
 
bool waitForFinish (int timeout_msecs) DEPRECATEDM("use waitForFinish(PISystemTime)")
 Устаревшая перегрузка waitForFinish(), принимающая миллисекунды. Подробнее...
 
void needLockRun (bool need)
 Включает блокировку внутреннего мьютекса вокруг begin(), run(), обратных вызовов и end().
 
PIMutexmutex () const
 Возвращает внутренний мьютекс, используемый lock(), unlock() и needLockRun().
 
llong tid () const
 Возвращает системный идентификатор потока, либо -1 когда поток не запущен.
 
- Открытые члены унаследованные от PIObject
 PIObject (const PIString &name=PIString())
 Создает объект и инициализирует его свойство name.
 
virtual ~PIObject ()
 Уничтожает объект, вызывает deleted() и отключает его от событийного графа.
 
PIString name () const
 Возвращает свойство name этого объекта.
 
virtual const char * className () const
 Возвращает зарегистрированное имя класса этого объекта.
 
virtual uint classNameID () const
 Возвращает хэш от className().
 
virtual const char * parentClassName () const
 Возвращает зарегистрированное имя родительского класса, либо пустую строку для корня.
 
bool debug () const
 Возвращает, включен ли вывод piCoutObj для этого объекта.
 
void setName (const PIString &name)
 Устанавливает свойство name этого объекта.
 
void setDebug (bool debug)
 Включает или отключает вывод piCoutObj для этого объекта.
 
PIVariant property (const char *name) const
 Возвращает свойство объекта по имени "name".
 
void setProperty (const char *name, const PIVariant &value)
 Устанавливает свойство "name" в значение "value" и создаёт его при необходимости. Подробнее...
 
bool isPropertyExists (const char *name) const
 Возвращает, существует ли свойство "name".
 
void setThreadSafe (bool yes)
 Включает или отключает внутренний мьютекс объекта во время выполнения обработчиков. Подробнее...
 
bool isThreadSafe () const
 Возвращает, включен ли внутренний мьютекс объекта для выполнения обработчиков.
 
bool execute (const PIString &method, const PIVector< PIVariantSimple > &vl)
 Выполняет зарегистрированный метод или метод-обработчик по имени с переданными аргументами. Подробнее...
 
bool execute (const PIString &method)
 Перегрузка execute() для метода без аргументов.
 
bool execute (const PIString &method, const PIVariantSimple &v0)
 Перегрузка execute() для одного аргумента.
 
bool execute (const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1)
 Перегрузка execute() для двух аргументов.
 
bool execute (const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2)
 Перегрузка execute() для трёх аргументов.
 
bool execute (const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2, const PIVariantSimple &v3)
 Перегрузка execute() для четырёх аргументов.
 
bool executeQueued (PIObject *performer, const PIString &method, const PIVector< PIVariantSimple > &vl)
 Ставит выполнение зарегистрированного метода в очередь объекта-исполнителя. Подробнее...
 
bool executeQueued (PIObject *performer, const PIString &method)
 Перегрузка executeQueued() для метода без аргументов.
 
bool executeQueued (PIObject *performer, const PIString &method, const PIVariantSimple &v0)
 Перегрузка executeQueued() для одного аргумента.
 
bool executeQueued (PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1)
 Перегрузка executeQueued() для двух аргументов.
 
bool executeQueued (PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2)
 Перегрузка executeQueued() для трёх аргументов.
 
bool executeQueued (PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2, const PIVariantSimple &v3)
 Перегрузка executeQueued() для четырёх аргументов.
 
void dump (const PIString &line_prefix=PIString()) const
 Выводит диагностическую информацию об объекте в проектный поток вывода.
 
PIStringList scopeList () const
 Возвращает зарегистрированную цепочку наследования объекта, включая его собственный класс.
 
PIStringList methodsEH () const
 Возвращает полные сигнатуры всех зарегистрированных событий и обработчиков для области этого класса.
 
bool isMethodEHContains (const PIString &name) const
 Возвращает, существует ли зарегистрированное событие или обработчик с таким именем.
 
PIString methodEHArguments (const PIString &name) const
 Возвращает список типов аргументов зарегистрированного метода через запятую.
 
PIString methodEHFullFormat (const PIString &name) const
 Возвращает полную зарегистрированную сигнатуру метода.
 
PIString methodEHFromAddr (const void *addr) const
 Возвращает имя зарегистрированного метода для указанного адреса точки входа.
 
void piDisconnect (const PIString &sig, PIObject *dest, void *ev_h)
 Разрывает соединения этого объекта-источника с конкретным обработчиком объекта-приемника для события "sig".
 
void piDisconnect (const PIString &sig, PIObject *dest)
 Разрывает все соединения этого объекта-источника от события "sig" к объекту-приемнику "dest".
 
void piDisconnect (const PIString &sig)
 Разрывает все соединения этого объекта-источника от события "sig".
 
bool isPIObject () const
 Возвращает, указывает ли этот указатель на ещё существующий экземпляр PIObject.
 
template<typename T >
bool isTypeOf () const
 Возвращает, принадлежит ли этот объект классу "T" или одному из его зарегистрированных потомков.
 
template<typename T >
T * cast () const
 Возвращает этот объект, приведённый к типу "T", если isTypeOf<T>() успешно, иначе nullptr.
 
void callQueuedEvents ()
 Выполняет все отложенные доставки, поставленные в очередь этому объекту-исполнителю.
 
bool maybeCallQueuedEvents ()
 Выполняет отложенные доставки только если этот объект использовался как исполнитель. Подробнее...
 
void deleteLater ()
 Планирует отложенное удаление объекта. Подробнее...
 
void deleted (PIObject *o)
 Вызывается непосредственно перед уничтожением объекта. Подробнее...
 

Открытые статические члены

static void runOnce (PIObject *object, const char *handler, const PIString &name=PIString())
 Создает временный поток и вызывает в нем обработчик handler объекта object. Подробнее...
 
static void runOnce (std::function< void()> func, const PIString &name=PIString())
 Создает временный поток и выполняет в нем лямбда-выражение func. Подробнее...
 
- Открытые статические члены унаследованные от PIObject
static bool execute (PIObject *o, const PIString &method, const PIVector< PIVariantSimple > &vl)
 Статическая удобная обёртка над execute().
 
static bool execute (PIObject *o, const PIString &method)
 Статическая перегрузка execute() без аргументов.
 
static bool execute (PIObject *o, const PIString &method, const PIVariantSimple &v0)
 Статическая перегрузка execute() для одного аргумента.
 
static bool execute (PIObject *o, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1)
 Статическая перегрузка execute() для двух аргументов.
 
static bool execute (PIObject *o, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2)
 Статическая перегрузка execute() для трёх аргументов.
 
static bool execute (PIObject *o, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2, const PIVariantSimple &v3)
 Статическая перегрузка execute() для четырёх аргументов.
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method, const PIVector< PIVariantSimple > &vl)
 Статическая удобная обёртка над executeQueued().
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method)
 Статическая перегрузка executeQueued() без аргументов.
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method, const PIVariantSimple &v0)
 Статическая перегрузка executeQueued() для одного аргумента.
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1)
 Статическая перегрузка executeQueued() для двух аргументов.
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2)
 Статическая перегрузка executeQueued() для трёх аргументов.
 
static bool executeQueued (PIObject *o, PIObject *performer, const PIString &method, const PIVariantSimple &v0, const PIVariantSimple &v1, const PIVariantSimple &v2, const PIVariantSimple &v3)
 Статическая перегрузка executeQueued() для четырёх аргументов.
 
static PIObject::Connection piConnect (PIObject *src, const PIString &sig, PIObject *dest_o, void *dest, void *ev_h, void *e_h, int args, const char *loc)
 Низкоуровневый помощник прямого соединения, лежащий под устаревшими макросами CONNECT*.
 
static PIObject::Connection piConnectU (PIObject *src, const PIString &sig, PIObject *dest_o, void *dest, const PIString &hname, const char *loc, PIObject *performer=0)
 Низкоуровневый помощник соединения по имени, лежащий под CONNECTU() и CONNECTU_QUEUED().
 
static PIObject::Connection piConnectLS (PIObject *src, const PIString &sig, std::function< void()> *f, const char *loc)
 Низкоуровневый помощник, который соединяет событие с лямбдой или обёрткой функтора.
 
static void piDisconnect (PIObject *src, const PIString &sig, PIObject *dest, void *ev_h)
 Разрывает соединения объекта-источника "src" с конкретным обработчиком объекта-приемника для события "sig".
 
static void piDisconnect (PIObject *src, const PIString &sig, PIObject *dest)
 Разрывает все соединения объекта-источника "src" от события "sig" к объекту-приемнику "dest".
 
static void piDisconnect (PIObject *src, const PIString &sig)
 Разрывает все соединения объекта-источника "src" от события "sig".
 
static void raiseEvent (PIObject *sender, const uint eventID)
 Внутренний помощник доставки для зарегистрированных событий без аргументов.
 
template<typename T0 >
static void raiseEvent (PIObject *sender, const uint eventID, const T0 &v0=T0())
 Внутренний помощник доставки для зарегистрированных событий с одним аргументом.
 
template<typename T0 , typename T1 >
static void raiseEvent (PIObject *sender, const uint eventID, const T0 &v0=T0(), const T1 &v1=T1())
 Внутренний помощник доставки для зарегистрированных событий с двумя аргументами.
 
template<typename T0 , typename T1 , typename T2 >
static void raiseEvent (PIObject *sender, const uint eventID, const T0 &v0=T0(), const T1 &v1=T1(), const T2 &v2=T2())
 Внутренний помощник доставки для зарегистрированных событий с тремя аргументами.
 
template<typename T0 , typename T1 , typename T2 , typename T3 >
static void raiseEvent (PIObject *sender, const uint eventID, const T0 &v0=T0(), const T1 &v1=T1(), const T2 &v2=T2(), const T3 &v3=T3())
 Внутренний помощник доставки для зарегистрированных событий с четырьмя аргументами.
 
static PIObjectfindByName (const PIString &name)
 Возвращает первый живой объект с именем "name", либо nullptr.
 
static bool isPIObject (const PIObject *o)
 Возвращает, указывает ли "o" на ещё существующий экземпляр PIObject.
 
static bool isPIObject (const void *o)
 Перегрузка isPIObject() для нетипизированного указателя.
 
template<typename T >
static bool isTypeOf (const PIObject *o)
 Возвращает, принадлежит ли "o" классу "T" или одному из его зарегистрированных потомков.
 
template<typename T >
static bool isTypeOf (const void *o)
 Перегрузка isTypeOf() для нетипизированного указателя.
 
static PIString simplifyType (const char *a, bool readable=true)
 Упрощает запись типа C++ для метаданных зарегистрированных методов.
 

Защищенные члены

virtual void begin ()
 Виртуальный метод, выполняемый один раз после запуска системного потока и до started().
 
virtual void run ()
 Виртуальный метод, выполняемый на каждой итерации цикла, пока не запрошен останов.
 
virtual void end ()
 Виртуальный метод, выполняемый один раз при завершении потока после stopped().
 
- Защищенные члены унаследованные от PIObject
PIObjectemitter () const
 Возвращает объект-источник, который вызвал текущее событие. Подробнее...
 
virtual void propertyChanged (const char *name)
 Виртуальный метод, вызываемый после изменения свойства "name" через setProperty().
 

Handlers

void stop ()
 Запрашивает корректное завершение потока. Подробнее...
 
void terminate ()
 Принудительно прерывает поток. Используйте только как крайнюю меру. Подробнее...
 
void lock () const
 Блокирует внутренний мьютекс.
 
void unlock () const
 Разблокирует внутренний мьютекс.
 

Events

void started ()
 Вызывается после запуска потока.
 
void stopped ()
 Вызывается при начале завершения потока.
 

Дополнительные унаследованные члены

Подробное описание

Объект потока, выполняющий работу в отдельном системном потоке.

Класс потока

Стандартный цикл вызывает begin(), затем повторяет обработку отложенной доставки для этого объекта-исполнителя вместе с run(), а при остановке вызывает end(). Используйте startOnce(), когда нужен только один проход без повторяющегося цикла обработки очереди.

Этот класс позволяет выполнять код из параллельного потока.

Краткий обзор

Многопоточность позволяет исполнять код в нескольких потоках одновременно и использовать все ядра современных процессоров. Однако это таит в себе опасности.

Этот класс предоставляет виртуальные методы begin(), run() и end(), которые описывают старт, выполнение и завершение потоковой задачи. Все эти методы исполняются в отдельном потоке. Когда выполняется start(int), PIThread создает отдельный поток средствами ОС и последовательно выполняет begin(), run() и end(). Можно переопределить каждый метод для реализации нужной задачи.

Схема выполнения методов:

virtual begin()
event started()
while (isRunning()) { // while not stop()
virtual run()
ThreadFunc() // Slot or lambda
piMSleep(loop_delay) // if loop_delay > 0
}
event stopped()
virtual end()
bool isRunning() const
Возвращает, выполняется ли поток в данный момент.
Definition: pithread.h:211
void started()
Вызывается после запуска потока.
virtual void begin()
Виртуальный метод, выполняемый один раз после запуска системного потока и до started().
Definition: pithread.h:309
virtual void run()
Виртуальный метод, выполняемый на каждой итерации цикла, пока не запрошен останов.
Definition: pithread.h:313
void stopped()
Вызывается при начале завершения потока.
virtual void end()
Виртуальный метод, выполняемый один раз при завершении потока после stopped().
Definition: pithread.h:317
void piMSleep(double msecs)
Точно ожидает "msecs" миллисекунд
Definition: pitime.h:41
std::function< void(void *)> ThreadFunc
Обратный вызов, который PIThread выполняет с текущим указателем data().
Definition: pithread.h:81

Если внутренний цикл не нужен, то можно использовать метод startOnce() вместо start(int).

В этом случает схема выполнения следущая:

virtual begin()
event started()
virtual run()
ThreadFunc() // Slot or lambda
event stopped()
virtual end()

В отличии от прямого использования "pthread" или похожих механизмов нет необходимости писать свой цикл внутри поточного метода и ожидать в его теле. PIThread уже рализует такой цикл, необходимо лишь установить значение ожидания в конструкторе или при запуске потока, и переопределить методы begin(), run() и end().

Использование с внутренним циклом

class MyThread: public PIThread {
public:
void begin() override {piCout << "thread begin";}
void run() override {piCout << "thread run" << ++cnt;}
void end() override {piCout << "thread end";}
private:
int cnt = 0;
};
int main(int argc, char * argv[]) {
MyThread mt;
mt.start(100);
piMSleep(500);
mt.stop(true);
return 0;
}
// thread begin
// thread run 1
// thread run 2
// thread run 3
// thread run 4
// thread run 5
// thread end
#define PIOBJECT_SUBCLASS(name, parent)
Поместите этот макрос внутрь объявления наследника PIObject, чтобы унаследовать зарегистрированные ме...
Definition: piobject_macros.h:53
Объект потока, выполняющий работу в отдельном системном потоке.
Definition: pithread.h:99
#define piCout
Definition: picout.h:36

Использование без внутреннего цикла

class MyThread: public PIThread {
public:
void begin() override {piCout << "thread begin";}
void run() override {piCout << "thread run" << ++cnt;}
void end() override {piCout << "thread end";}
private:
int cnt = 0;
};
int main(int argc, char * argv[]) {
MyThread mt;
mt.startOnce();
piMSleep(500);
mt.stop(true);
return 0;
}
// thread begin
// thread run 1
// thread end

Использование без наследования

Возможно использовать PIThread без наследования. Можно передать ему в конструкторе или при запуске указатель на внешний метод "ThreadFunc". В основном цикле потока, если "ThreadFunc" существует, он будет вызываться после run().

ThreadFunc может быть любым статическим методом в формате "void func(void * data)", либо лямбда-выражение в формате [...]( ){...}. "Data" является произвольным указателем, задаваемым в конструкторе или методом setData().

Также можно присоединиться к событию started(), но в этом случае надо будет своими силами реализовать весь цикл, т.к. это событие вызывается один раз после запуска потока.

Использование с внутренним циклом

void myThreadFunc(void * d) {
int * cnt = (int*)d;
piCout << "thread run" << ++(*cnt);
}
int main(int argc, char * argv[]) {
int cnt = 0;
mt.setData(&cnt);
mt.start(myThreadFunc, 100);
piMSleep(500);
mt.stop(true);
return 0;
}
// thread run 1
// thread run 2
// thread run 3
// thread run 4
// thread run 5
bool start()
Запускает поток с сохраненными обратным вызовом и задержкой цикла.
Definition: pithread.cpp:599
void setData(void *d)
Устанавливает указатель данных, передаваемый в обратные вызовы ThreadFunc.
Definition: pithread.h:185
void stop()
Запрашивает корректное завершение потока.
Definition: pithread.cpp:661

Использование без внутреннего цикла

void myThreadFunc(void * d) {
int * cnt = (int*)d;
piCout << "thread run" << ++(*cnt);
}
int main(int argc, char * argv[]) {
int cnt = 0;
mt.setData(&cnt);
mt.startOnce(myThreadFunc);
piMSleep(500);
mt.stop(true);
return 0;
}
// thread run 1
bool startOnce()
Запускает одноразовый поток без повторяющегося цикла.
Definition: pithread.cpp:637

Использование с лямбда-выражением

int main(int argc, char * argv[]) {
int cnt = 0;
mt.start([&cnt](){
piCout << "thread run" << ++cnt;
}, 100);
piMSleep(500);
mt.stop(true);
return 0;
}
// thread run 1
// thread run 2
// thread run 3
// thread run 4
// thread run 5

Использование с событием

class MyObj: public PIObject {
PIOBJECT(MyObj)
public:
EVENT_HANDLER(void, threadRun) {
piForTimes (5) {
piCout << "threadRun" << ++cnt;
piMSleep(100);
}
};
private:
int cnt = 0;
};
int main(int argc, char * argv[]) {
MyObj mo;
CONNECTU(&mt, started, &mo, threadRun);
mt.startOnce();
mt.stop(true);
return 0;
}
// threadRun 1
// threadRun 2
// threadRun 3
// threadRun 4
// threadRun 5
Базовый класс для объектов, которые объявляют события, обработчики событий и зарегистрированные метод...
Definition: piobject.h:56
#define CONNECTU(src, event, dest, handler)
Соединяет событие "event" объекта "src" к обработчику или событию "handler" объекта "dest".
Definition: piobject_macros.h:204
#define EVENT_HANDLER
Аналог EVENT_HANDLER0.
Definition: piobject_macros.h:91
#define PIOBJECT(name)
Поместите этот макрос внутрь объявления прямого наследника PIObject, чтобы включить регистрацию событ...
Definition: piobject_macros.h:46
#define piForTimes(c)
Макрос для короткой записи стандартного цикла "for".
Definition: picontainers.h:128

Блокировки

PIThread имеет встроенный мьютекс, который может блокироваться и разблокироваться каждый run() при установленном needLockRun(true). К нему есть доступ через методы lock(), unlock() и mutex(). Использование этих методов вне потока совместно с needLockRun(true) поможет защитить данные.

Перечисления

◆ Priority

Подсказка приоритета потока.

Элементы перечислений
piLowerst 

Низший

piLow 

Низкий

piNormal 

Нормальный, это приоритет по умолчанию для потоков и таймеров

piHigh 

Высокий

piHighest 

Высший

Методы

◆ startOnce() [1/2]

bool PIThread::startOnce ( )

Запускает одноразовый поток без повторяющегося цикла.

Начинает выполнение run() один раз. Также поток вызывает внешний метод, заданный через setSlot(), если он существует.

Возвращает
false если поток уже запущен или не может запуститься

◆ startOnce() [2/2]

bool PIThread::startOnce ( ThreadFunc  func)

Сохраняет обратный вызов и запускает одноразовое выполнение.

Перегрузка метода, устанавливает внешний метод в "func" перед запуском.

Возвращает
false если поток уже запущен или не может запуститься

◆ waitForStart()

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

Устаревшая перегрузка waitForStart(), принимающая миллисекунды.

Блокирует до тех пор, пока поток не запустится в течении "timeout_msecs", или бесконечно, если "timeout_msecs" < 0

Возвращает
true если поток запустился менее чем за таймаут
false если таймаут истёк

◆ waitForFinish()

bool PIThread::waitForFinish ( int  timeout_msecs = -1)
inline

Устаревшая перегрузка waitForFinish(), принимающая миллисекунды.

Блокирует до тех пор, пока поток не завершится в течении "timeout_msecs", или бесконечно, если "timeout_msecs" < 0

Возвращает
true если поток завершился менее чем за таймаут
false если таймаут истёк

◆ runOnce() [1/2]

void PIThread::runOnce ( PIObject object,
const char *  handler,
const PIString name = PIString() 
)
static

Создает временный поток и вызывает в нем обработчик handler объекта object.

Этот метод создает PIThread с именем "name" и выполняет обработчик "handler" объекта "object" в этом потоке.
PIThread автоматически удаляется после завершения обработчика.

class MyObj: public PIObject {
PIOBJECT(MyObj)
public:
EVENT_HANDLER(void, threadRun) {
piForTimes (5) {
piCout << "threadRun";
piMSleep(100);
}
};
};
int main(int argc, char * argv[]) {
MyObj mo;
PIThread::runOnce(&mo, "threadRun");
piMSleep(1000); // wait for thread finish
return 0;
}
static void runOnce(PIObject *object, const char *handler, const PIString &name=PIString())
Создает временный поток и вызывает в нем обработчик handler объекта object.
Definition: pithread.cpp:1005

◆ runOnce() [2/2]

void PIThread::runOnce ( std::function< void()>  func,
const PIString name = PIString() 
)
static

Создает временный поток и выполняет в нем лямбда-выражение func.

Этот метод создает PIThread с именем "name" и выполняет лямбда-выражение "func" в этом потоке.
PIThread автоматически удаляется после завершения функции.
"func" не должна иметь аргументов.

piCout << "thread func";
piMSleep(100);
}
});
piMSleep(1000);

◆ stop()

void PIThread::stop ( )

Запрашивает корректное завершение потока.

Помечает поток на остановку и ожидает завершения если "wait" true. Поток может быть остановлен только вне run() или внешнего метода.

Предупреждения
Этот метод может ожидать бесконечно если "wait" true и любой из потоковых методов занят навечно.

◆ terminate()

void PIThread::terminate ( )

Принудительно прерывает поток. Используйте только как крайнюю меру.

Немедленно останавливает поток.

Предупреждения
Это может повредить память, старайтесь не использовать этот метод!