Last active
May 20, 2020 10:14
-
-
Save pthom/81c4619d60fd08d526a679a7ba8a0a74 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <future> | |
class MyThreadedCameraCalibComputer | |
{ | |
public: | |
struct GuiCalibInfo | |
{ | |
cv::Mat mImage; | |
std::string result; | |
std::string userInstruction; | |
HintId hintId = HintId::NoHint; | |
}; | |
MyThreadedCameraCalibComputer() | |
{ | |
// on lance le background thread a la creation | |
mProcessAsyncWorkResult = std::async( | |
[this] { this->ProcessAsyncWork(); }, | |
std::launch::async); | |
} | |
virtual ~MyCameraCalibComputer() | |
{ | |
mStopRequired = true; // on arrete le background thread a la destruction | |
} | |
virtual void EnqueueImage(const cv::Mat &image) | |
{ | |
// On ne fait que stocker la prochaine image a traiter | |
mNextImageToProcess_Mutex.lock(); | |
mNextImageToProcess_Mutex = image.clone(); | |
mNextImageToProcess_Mutex.unlock(); | |
} | |
virtual void EnqueueAcceleration(const cv::Vec3d &accel) | |
{ | |
// Pas géré pour l'instant | |
} | |
virtual GuiCalibInfo GetGuiCalibInfo() | |
{ | |
GuiCalibInfo r; | |
mLastGuiCalibInfo_Mutex.lock(); | |
r = mLastGuiCalibInfo; | |
mLastGuiCalibInfo_Mutex.unlock(); | |
return r; | |
} | |
virtual bool IsProcessFinished() | |
{ | |
return false; | |
} | |
private: | |
// Fonction qui tourne en continu dans un thread et qui est lancee a la creation | |
void ProcessAsyncWork() | |
{ | |
while( ! mStopRequired) // Elle sera arretee par le destructeur | |
{ | |
mNextImageToProcess_Mutex.lock(); | |
cv::Mat nextImageToProcessClone = mNextImageToProcess.clone(); | |
mNextImageToProcess_Mutex.unlock(); | |
if ( ! nextImageToProcessClone.empty()) | |
{ | |
// Call process image | |
... | |
// (Ne pas rajouter de code métier ici! faire un simple | |
// appel d'une méthode dans une autre classe: cette classe en fait déja assez | |
// avec la gestion des thread) | |
// Fill mLastGuiCalibInfo, with a mutex | |
mLastGuiCalibInfo_Mutex.lock(); | |
mLastGuiCalibInfo = ... | |
// Pareil ici, appeler une méthode ou fonction dans une autre classe. | |
mLastGuiCalibInfo_Mutex.unlock(); | |
} | |
} | |
} | |
private: | |
// Thread variables | |
// mProcessAsyncWorkResult est important ! Il *faut* stocker le resultat | |
// d'un appel a std::async (même si c'est un void), sinon la destruction de l'async | |
// attendra la fin de l'appel asynchrone (et dans notre cas, c'est une boucle infinie !) | |
std::future<void> mProcessAsyncWorkResult; | |
std::atomic<bool> mStopRequired = false; // vaudra true quand on veut arreter | |
// Next image top process, protected by a mutex | |
cv::Mat mNextImageToProcess; | |
std::mutex mNextImageToProcess_Mutex; // pour proteger les acces concurrents ! | |
// Next Gui Status, also protected by a mutex | |
GuiCalibInfo mLastGuiCalibInfo; | |
std::mutex mLastGuiCalibInfo_Mutex; // pour proteger les acces concurrents ! | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment