Fichier texte en cours : threads.txt
Deprecated : Function utf8_encode() is deprecated since 8.2, visit the php.net documentation for various alternatives in /home/anthropoya/www/explorer/text.php on line 55
#ifndef THREADS_WRAPPER_H #define THREADS_WRAPPER_H #include "Singleton.h" #include "Types.h" #include #include #include #include class ThreadsWrapper : public Singleton { public: typedef uint32 ThreadSlotNumber; class Thread { friend class ThreadsWrapper; public: std::string sName; std::thread::id lastId; bool finished; protected: std::vector pThreads; void* pRetValue; std::function pRunFunction; uint32 iSlot; }; ThreadsWrapper(); virtual ~ThreadsWrapper(); // --------------------- // // Mettre en protected Thread* RegisterThread(const std::function & threadFonction, uint32 iSlot) { Thread* pThread = new Thread; pThread->pRetValue = nullptr; pThread->pRunFunction = threadFonction; pThread->lastId = std::thread::id(); pThread->sName = "thread1"; pThread->iSlot = iSlot; pThread->finished = false; m_entries[iSlot] = pThread; return pThread; } /* template Thread* CreateThread(void (f)(Params...), Args... args) { std::function tF = std::bind(f, args ...); std::function tRun = std::bind(&ThreadsWrapper::RunThread, this, tF); debugprint("CreateThread 1") // On enregistre le thread Thread* t = RegisterThread(tRun, m_iCurrentRegisteredThread); m_iCurrentRegisteredThread++. return t; } */ /* template Thread* CreateThread(R f, Args... args) { std::function tF = std::bind(f, args ...); std::function tRun = std::bind(&ThreadsWrapper::RunThread, this, tF); debugprint("CreateThread 2") // On enregistre le thread Thread* t = RegisterThread(tRun, m_iCurrentRegisteredThread); m_iCurrentRegisteredThread++; return t; } */ // R = void // R retour = ... template Thread* CreateThread(R (C::*f) (Params...), Args... args) { // La fonction à threader std::function tF = std::bind(f, args ...); std::function tR = std::bind(&ThreadsWrapper::RunThread, this, tF, m_iCurrentRegisteredThread); // La fonction de biais entre le thread et la fonction à threader // std::function tFinal = std::bind(tR); //ReturnValue r; debugprint("CreateThread 3") // On enregistre le thread Thread* t = RegisterThread(tR, m_iCurrentRegisteredThread); m_iCurrentRegisteredThread++; return t; } /* template Thread* CreateThread(R (*f)(Args... args1)) { // La fonction à threader std::function tF = std::bind(f, args ...); // La fonction de biais entre le thread et la fonction à threader std::function tRun = std::bind(&ThreadsWrapper::RunTest, this, tF); ReturnValue r; debugprint("CreateThread 3") // On enregistre le thread Thread* t = RegisterThread(tRun, m_iCurrentRegisteredThread); m_iCurrentRegisteredThread++; return nullptr; } */ bool IsRegistered(const Thread* t) { if (t == nullptr) { return false; } return m_entries.count(t->iSlot) > 0; } // todo : utiliser std::this_thread::get_id();... std::thread::id LaunchThread(Thread* t) { if (IsRegistered(t)) { // On lance le thread ! std::thread* pExec = new std::thread (t->pRunFunction); t->pThreads.push_back(pExec); std::thread::id id = pExec->get_id(); t->lastId = id; return id; } else { // On renvoie un id par defaut ! return std::thread::id(); } } std::thread::id GetThreadId(const Thread* t) { if (IsRegistered(t)) { return t->lastId; } else { return std::thread::id(); } } template T GetReturnValue(const Thread* t) // pointeur obligé normalement { if (IsRegistered(t) && t->finished) { return (T)t->pRetValue; } else { return nullptr; } } protected: /* template void RunThread(Retour&& func) { Retour r = func(); debugprint("RunThread 1") } */ template void RunThread(std::function f, uint32 iSlot) { R r = f(); ReturnValue value; value.value = r; Thread* pThread = m_entries[iSlot]; if (pThread) { pThread->pRetValue = r; pThread->finished = true; } debugprint("RunThread 2") } /* void RunThread(std::function f) { f(); debugprint("RunThread 3") } */ /* template Thread* GetThreadOfFunction(std::function f) { for (auto i = 0; i < m_entries.size(); i++) { Thread* pCurrent = m_entries[i]; if (pCurrent->pRunFunction == f) { return pCurrent; } } return nullptr; } */ private: std::map m_entries; /* template static std::map> m_values; */ uint32 m_iCurrentRegisteredThread; }; #endif
Clément Profit - 2019 / 2026 - Répertoire de fichiers global .