aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/examples/cpp-multithread
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-09-09 02:30:51 +0200
committerStapleButter <thetotalworm@gmail.com>2017-09-09 02:30:51 +0200
commit70e4841d311d68689724768157cc9cbfbde7a9fc (patch)
treeba9499f77d1258530a7e60aa6e1732c41d98161c /src/libui_sdl/libui/examples/cpp-multithread
parent81747d6c34eb159481a6ca3f283d065fa3568617 (diff)
another UI attempt, I guess.
sorry.
Diffstat (limited to 'src/libui_sdl/libui/examples/cpp-multithread')
-rw-r--r--src/libui_sdl/libui/examples/cpp-multithread/main.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/examples/cpp-multithread/main.cpp b/src/libui_sdl/libui/examples/cpp-multithread/main.cpp
new file mode 100644
index 0000000..f97bc6f
--- /dev/null
+++ b/src/libui_sdl/libui/examples/cpp-multithread/main.cpp
@@ -0,0 +1,92 @@
+// 6 december 2015
+#include <thread>
+#include <chrono>
+#include <mutex>
+#include <condition_variable>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include "../../ui.h"
+using namespace std;
+
+uiMultilineEntry *e;
+condition_variable cv;
+mutex m;
+unique_lock<mutex> ourlock(m);
+thread *timeThread;
+
+void sayTime(void *data)
+{
+ char *s = (char *) data;
+
+ uiMultilineEntryAppend(e, s);
+ delete s;
+}
+
+void threadproc(void)
+{
+ ourlock.lock();
+ while (cv.wait_for(ourlock, chrono::seconds(1)) == cv_status::timeout) {
+ time_t t;
+ char *base;
+ char *s;
+
+ t = time(NULL);
+ base = ctime(&t);
+ s = new char[strlen(base) + 1];
+ strcpy(s, base);
+ uiQueueMain(sayTime, s);
+ }
+}
+
+int onClosing(uiWindow *w, void *data)
+{
+ cv.notify_all();
+ // C++ throws a hissy fit if you don't do this
+ // we might as well, to ensure no uiQueueMain() gets in after uiQuit()
+ timeThread->join();
+ uiQuit();
+ return 1;
+}
+
+void saySomething(uiButton *b, void *data)
+{
+ uiMultilineEntryAppend(e, "Saying something\n");
+}
+
+int main(void)
+{
+ uiInitOptions o;
+ uiWindow *w;
+ uiBox *b;
+ uiButton *btn;
+
+ memset(&o, 0, sizeof (uiInitOptions));
+ if (uiInit(&o) != NULL)
+ abort();
+
+ w = uiNewWindow("Hello", 320, 240, 0);
+ uiWindowSetMargined(w, 1);
+
+ b = uiNewVerticalBox();
+ uiBoxSetPadded(b, 1);
+ uiWindowSetChild(w, uiControl(b));
+
+ e = uiNewMultilineEntry();
+ uiMultilineEntrySetReadOnly(e, 1);
+
+ btn = uiNewButton("Say Something");
+ uiButtonOnClicked(btn, saySomething, NULL);
+ uiBoxAppend(b, uiControl(btn), 0);
+
+ uiBoxAppend(b, uiControl(e), 1);
+
+ // timeThread needs to lock ourlock itself - see http://stackoverflow.com/a/34121629/3408572
+ ourlock.unlock();
+ timeThread = new thread(threadproc);
+
+ uiWindowOnClosing(w, onClosing, NULL);
+ uiControlShow(uiControl(w));
+ uiMain();
+ return 0;
+}