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/testsxx.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) (limited to 'tests/testsxx.cpp') 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 +} -- cgit v1.2.3