19#include <QApplication>
22#include <condition_variable>
33 char appName[64] =
"GPU CA Standalone Event Display GUI";
35 std::unique_ptr<QApplication>
app;
36 std::unique_ptr<GPUDisplayGUI>
gui;
47std::atomic<bool> instanceExists =
false;
52 if (instanceExists.exchange(
true)) {
53 throw std::runtime_error(
"Must not start QApplication twice");
55 mO = std::make_unique<internal::GPUDisplayGUIWrapperObjects>();
56 mO->thread = std::thread(&GPUDisplayGUIWrapper::guiThread,
this);
63 std::lock_guard lock(mO->mutex);
66 mO->signal.notify_all();
68 instanceExists =
false;
71void GPUDisplayGUIWrapper::guiThread()
73 mO->app = std::make_unique<QApplication>(mO->argc, mO->argv);
74 std::unique_lock lock(mO->mutex);
76 mO->signal.wait(lock, [
this] {
return mO->start || mO->terminate; });
81 mO->gui = std::make_unique<GPUDisplayGUI>(mChannel);
84 mO->signal.notify_all();
90 mO->signal.notify_all();
98 std::unique_lock lock(mO->mutex);
101 mO->signal.notify_all();
102 mO->signal.wait(lock, [
this] {
return mO->started.load(); });
110 std::lock_guard lock(mChannel.
mutex);
111 mChannel.
stop =
true;
114 std::unique_lock lock(mO->mutex);
115 mO->signal.wait(lock, [
this] {
return !mO->started; });
121 std::lock_guard lock(mO->mutex);
GPUDisplayGUIWrapper(GPUDisplayGUIChannel &channel)
std::condition_variable stateUpdated
std::unique_ptr< QApplication > app
std::atomic< bool > started
std::condition_variable signal
std::unique_ptr< GPUDisplayGUI > gui