summaryrefslogtreecommitdiff
path: root/wx+/async_task.h
diff options
context:
space:
mode:
Diffstat (limited to 'wx+/async_task.h')
-rw-r--r--wx+/async_task.h39
1 files changed, 21 insertions, 18 deletions
diff --git a/wx+/async_task.h b/wx+/async_task.h
index 915f9602..7ac03949 100644
--- a/wx+/async_task.h
+++ b/wx+/async_task.h
@@ -24,6 +24,9 @@ Run a task in an async thread, but process result in GUI event loop
2. schedule async task and synchronous continuation:
guiQueue.processAsync(evalAsync, evalOnGui);
+
+Alternative: use wxWidgets' inter-thread communication (wxEvtHandler::QueueEvent) https://wiki.wxwidgets.org/Inter-Thread_and_Inter-Process_communication
+ => don't bother, probably too many MT race conditions lurking around
*/
namespace impl
@@ -74,7 +77,7 @@ public:
void add(Fun&& evalAsync, Fun2&& evalOnGui)
{
using ResultType = decltype(evalAsync());
- tasks.push_back(std::make_unique<ConcreteTask<ResultType, Fun2>>(zen::runAsync(std::forward<Fun>(evalAsync)), std::forward<Fun2>(evalOnGui)));
+ tasks_.push_back(std::make_unique<ConcreteTask<ResultType, Fun2>>(zen::runAsync(std::forward<Fun>(evalAsync)), std::forward<Fun2>(evalOnGui)));
}
//equivalent to "evalOnGui(evalAsync())"
// -> evalAsync: the usual thread-safety requirements apply!
@@ -82,14 +85,14 @@ public:
void evalResults() //call from gui thread repreatedly
{
- if (!inRecursion) //prevent implicit recursion, e.g. if we're called from an idle event and spawn another one within the callback below
+ if (!inRecursion_) //prevent implicit recursion, e.g. if we're called from an idle event and spawn another one within the callback below
{
- inRecursion = true;
- ZEN_ON_SCOPE_EXIT(inRecursion = false);
+ inRecursion_ = true;
+ ZEN_ON_SCOPE_EXIT(inRecursion_ = false);
std::vector<std::unique_ptr<Task>> readyTasks; //Reentrancy; access to AsyncTasks::add is not protected! => evaluate outside erase_if
- erase_if(tasks, [&](std::unique_ptr<Task>& task)
+ erase_if(tasks_, [&](std::unique_ptr<Task>& task)
{
if (task->resultReady())
{
@@ -104,14 +107,14 @@ public:
}
}
- bool empty() const { return tasks.empty(); }
+ bool empty() const { return tasks_.empty(); }
private:
AsyncTasks (const AsyncTasks&) = delete;
AsyncTasks& operator=(const AsyncTasks&) = delete;
- bool inRecursion = false;
- std::vector<std::unique_ptr<Task>> tasks;
+ bool inRecursion_ = false;
+ std::vector<std::unique_ptr<Task>> tasks_;
};
}
@@ -119,27 +122,27 @@ private:
class AsyncGuiQueue : private wxEvtHandler
{
public:
- AsyncGuiQueue() { timer.Connect(wxEVT_TIMER, wxEventHandler(AsyncGuiQueue::onTimerEvent), nullptr, this); }
+ AsyncGuiQueue() { timer_.Connect(wxEVT_TIMER, wxEventHandler(AsyncGuiQueue::onTimerEvent), nullptr, this); }
template <class Fun, class Fun2>
void processAsync(Fun&& evalAsync, Fun2&& evalOnGui)
{
- asyncTasks.add(std::forward<Fun >(evalAsync),
- std::forward<Fun2>(evalOnGui));
- if (!timer.IsRunning())
- timer.Start(50 /*unit: [ms]*/);
+ asyncTasks_.add(std::forward<Fun >(evalAsync),
+ std::forward<Fun2>(evalOnGui));
+ if (!timer_.IsRunning())
+ timer_.Start(50 /*unit: [ms]*/);
}
private:
void onTimerEvent(wxEvent& event) //schedule and run long-running tasks asynchronously
{
- asyncTasks.evalResults(); //process results on GUI queue
- if (asyncTasks.empty())
- timer.Stop();
+ asyncTasks_.evalResults(); //process results on GUI queue
+ if (asyncTasks_.empty())
+ timer_.Stop();
}
- impl::AsyncTasks asyncTasks;
- wxTimer timer; //don't use wxWidgets' idle handling => repeated idle requests/consumption hogs 100% cpu!
+ impl::AsyncTasks asyncTasks_;
+ wxTimer timer_; //don't use wxWidgets' idle handling => repeated idle requests/consumption hogs 100% cpu!
};
}
bgstack15