git-svn-id: svn://db.shs.com.ru/pip@888 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -120,6 +120,22 @@ PIVector<PIThread * > __PIThreadCollection::threads() const {
|
||||
}
|
||||
|
||||
|
||||
void __PIThreadCollection::startedAuto(PIThread * t) {
|
||||
PIMutexLocker _ml(auto_mutex);
|
||||
auto_threads_ << t;
|
||||
}
|
||||
|
||||
|
||||
void __PIThreadCollection::stoppedAuto() {
|
||||
PIThread * t = emitter()->cast<PIThread>();
|
||||
if (!t) return;
|
||||
auto_mutex.lock();
|
||||
auto_threads_.removeAll(t);
|
||||
auto_mutex.unlock();
|
||||
delete t;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int __PIThreadCollection_Initializer__::count_(0);
|
||||
@@ -549,10 +565,26 @@ void PIThread::__thread_func_once__() {
|
||||
}
|
||||
|
||||
|
||||
PIThread * PIThread::runOnce(std::function<void ()> func) {
|
||||
void PIThread::runOnce(PIObject * object, const char * handler, const PIString & name) {
|
||||
PIThread * t = new PIThread();
|
||||
t->setSlot(func);
|
||||
t->setName(name);
|
||||
if (!PIObject::piConnectU(t, PIStringAscii("started"), object, object, PIStringAscii(handler), "PIThread::runOnce")) {
|
||||
delete t;
|
||||
return;
|
||||
}
|
||||
__PIThreadCollection::instance()->startedAuto(t);
|
||||
CONNECTU(t, stopped, __PIThreadCollection::instance(), stoppedAuto);
|
||||
t->startOnce();
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
void PIThread::runOnce(std::function<void ()> func, const PIString & name) {
|
||||
PIThread * t = new PIThread();
|
||||
t->setName(name);
|
||||
t->setSlot(func);
|
||||
__PIThreadCollection::instance()->startedAuto(t);
|
||||
CONNECTU(t, stopped, __PIThreadCollection::instance(), stoppedAuto);
|
||||
t->startOnce();
|
||||
//return t;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,8 @@
|
||||
class PIThread;
|
||||
class PIIntrospectionThreads;
|
||||
|
||||
class PIP_EXPORT __PIThreadCollection {
|
||||
class PIP_EXPORT __PIThreadCollection: public PIObject {
|
||||
PIOBJECT(__PIThreadCollection)
|
||||
public:
|
||||
static __PIThreadCollection * instance();
|
||||
void registerThread(PIThread * t);
|
||||
@@ -40,9 +41,11 @@ public:
|
||||
PIVector<PIThread * > threads() const;
|
||||
void lock() {mutex.lock();}
|
||||
void unlock() {mutex.unlock();}
|
||||
void startedAuto(PIThread * t);
|
||||
EVENT_HANDLER(void, stoppedAuto);
|
||||
private:
|
||||
PIVector<PIThread * > threads_;
|
||||
mutable PIMutex mutex;
|
||||
PIVector<PIThread * > threads_, auto_threads_;
|
||||
mutable PIMutex mutex, auto_mutex;
|
||||
};
|
||||
|
||||
|
||||
@@ -155,8 +158,15 @@ public:
|
||||
EVENT(started)
|
||||
EVENT(stopped)
|
||||
|
||||
//! \brief Start event handler with name \"handler\" of object \"object\"
|
||||
//! in separate thread with name \"name\"
|
||||
//! and automatically delete it on function finish
|
||||
static void runOnce(PIObject * object, const char * handler, const PIString & name = PIString());
|
||||
|
||||
#ifdef PIP_CXX11_SUPPORT
|
||||
static PIThread * runOnce(std::function<void()> func);
|
||||
//! \brief Start function \"func\" in separate thread with name \"name\"
|
||||
//! and automatically delete it on function finish
|
||||
static void runOnce(std::function<void()> func, const PIString & name = PIString());
|
||||
#endif
|
||||
|
||||
//! \handlers
|
||||
|
||||
Reference in New Issue
Block a user