18#include <QApplication>
23#include <condition_variable>
30 std::unique_ptr<QApplication>
app;
31 std::unique_ptr<GPUDisplayGUI>
gui;
35 volatile bool stop =
false;
46 static bool first =
true;
47 static std::mutex mutex;
49 std::lock_guard<std::mutex> guard(mutex);
51 throw std::runtime_error(
"Must not start QApplication twice");
56 mO->t = std::thread(&GPUDisplayGUIWrapper::guiThread,
this);
62 std::lock_guard<std::mutex> guard(mO->mutex);
64 mO->signal.notify_one();
77void GPUDisplayGUIWrapper::guiThread()
79 static int32_t tmp_argc = 1;
80 static const char* tmp_argv[2] = {
"GPU CA Standalone Event Display GUI", NULL};
81 mO->app.reset(
new QApplication(tmp_argc, (
char**)tmp_argv));
82 while (!mO->terminate) {
84 std::unique_lock<std::mutex> lock(mO->mutex);
85 if (!mO->start && !mO->terminate) {
86 mO->signal.wait(lock);
96 mO->gui->setWrapper(
this);
98 mO->timer.reset(
new QTimer(mO->gui.get()));
100 mO->gui->connect(mO->timer.get(), SIGNAL(
timeout()), mO->gui.get(), SLOT(
UpdateTimer()));
102 std::lock_guard<std::mutex> guard(mO->mutexRet);
104 mO->signalRet.notify_one();
108 mO->timer.reset(
nullptr);
109 mO->gui.reset(
nullptr);
110 std::lock_guard<std::mutex> guard(mO->mutexRet);
113 mO->signalRet.notify_one();
116 mO->app.reset(
nullptr);
123 std::lock_guard<std::mutex> guard(mO->mutex);
125 mO->signal.notify_one();
128 std::unique_lock<std::mutex> lock(mO->mutexRet);
129 while (mO->started ==
false) {
130 mO->signalRet.wait(lock);
142 std::unique_lock<std::mutex> lock(mO->mutexRet);
143 while (mO->stopped ==
false) {
144 mO->signalRet.wait(lock);
GLbitfield GLuint64 timeout
std::unique_ptr< QTimer > timer
std::condition_variable signalRet
std::unique_ptr< QApplication > app
std::condition_variable signal
std::unique_ptr< GPUDisplayGUI > gui