summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2009-07-09 00:32:36 +0000
committerTavian Barnes <tavianator@gmail.com>2009-07-09 00:32:36 +0000
commit0015b8757d2168ebfc75fc7ad6475e223d88d71c (patch)
treeac32786cb39ae8b40f0f2c5bf5385ca7dd0d9f19 /tests
parent9f1b759e2fac0b15a7ef5a7a527ba66dbdc319b6 (diff)
downloaddimension-0015b8757d2168ebfc75fc7ad6475e223d88d71c.tar.xz
New interface for background progress bars in C++ tests.
Diffstat (limited to 'tests')
-rw-r--r--tests/glxx.cpp6
-rw-r--r--tests/testsxx.cpp49
-rw-r--r--tests/testsxx.hpp3
3 files changed, 57 insertions, 1 deletions
diff --git a/tests/glxx.cpp b/tests/glxx.cpp
index b22111f..e44510b 100644
--- a/tests/glxx.cpp
+++ b/tests/glxx.cpp
@@ -42,12 +42,18 @@ main() {
// Render the scene
Progress progress = raytracer.render_async();
+ std::cout << "Raytracing scene: ";
+ Progress barprogress = Tests::progressbar_async(std::cout, progress);
+
// Display the scene as it's rendered
while (progress.progress() < 1.0) {
writer.write();
display.flush();
}
+ barprogress.finish();
+ std::cout << std::endl;
+
// Make sure we show the completed rendering
progress.finish();
writer.write();
diff --git a/tests/testsxx.cpp b/tests/testsxx.cpp
index e8dc910..908d0f8 100644
--- a/tests/testsxx.cpp
+++ b/tests/testsxx.cpp
@@ -76,6 +76,53 @@ namespace Dimension
{
dmnsn_display_flush(m_display);
}
+
+ namespace
+ {
+ struct Progressbar_Payload
+ {
+ public:
+ std::ostream* ostr;
+ const Progress* progress;
+ };
+
+ void *
+ progressbar_thread(void *ptr)
+ {
+ Progressbar_Payload* payload
+ = reinterpret_cast<Progressbar_Payload*>(ptr);
+
+ *payload->ostr << *payload->progress;
+
+ int* ret = static_cast<int*>(std::malloc(sizeof(int)));
+ if (ret) {
+ *ret = 0;
+ }
+ return ret;
+ }
+ }
+
+ Progress progressbar_async(std::ostream& ostr,
+ const Dimension::Progress& progress)
+ {
+ dmnsn_progress* barprogress = dmnsn_new_progress();
+ if (!barprogress) {
+ throw Dimension_Error("Couldn't allocate progress object.");
+ }
+
+ Progressbar_Payload* payload = new Progressbar_Payload;
+ payload->ostr = &ostr;
+ payload->progress = &progress;
+
+ /* Create the worker thread */
+ if (pthread_create(&barprogress->thread, NULL, &progressbar_thread,
+ reinterpret_cast<void*>(payload))
+ != 0) {
+ throw Dimension_Error("Couldn't create background thread.");
+ }
+
+ return Progress(barprogress);
+ }
}
// Print a progress bar of the progress of `progress'
@@ -91,4 +138,4 @@ namespace Dimension
}
return ostr << "|" << std::flush;
}
-} \ No newline at end of file
+}
diff --git a/tests/testsxx.hpp b/tests/testsxx.hpp
index c2c1771..e2b654f 100644
--- a/tests/testsxx.hpp
+++ b/tests/testsxx.hpp
@@ -43,6 +43,9 @@ namespace Dimension
private:
dmnsn_display* m_display;
};
+
+ Progress progressbar_async(std::ostream& ostr,
+ const Dimension::Progress& progress);
}
// Print a progress bar of the progress of `progress'