From 0015b8757d2168ebfc75fc7ad6475e223d88d71c Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Thu, 9 Jul 2009 00:32:36 +0000 Subject: New interface for background progress bars in C++ tests. --- tests/glxx.cpp | 6 ++++++ tests/testsxx.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- tests/testsxx.hpp | 3 +++ 3 files changed, 57 insertions(+), 1 deletion(-) (limited to 'tests') 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(ptr); + + *payload->ostr << *payload->progress; + + int* ret = static_cast(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(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' -- cgit v1.2.3