43class ChartTableEntryJobTicket {
45 ChartTableEntryJobTicket() {
51 ~ChartTableEntryJobTicket() {}
56 wxString m_ChartPathUTF8;
60 std::shared_ptr<struct ChartTableEntry> m_chart_table_entry;
66 wxString provider_class_name;
82class ChartTableEntryPoolThread :
public wxThread {
84 ChartTableEntryPoolThread(std::shared_ptr<ChartTableEntryJobTicket> ticket,
85 wxEvtHandler* message_target);
89 wxEvtHandler* m_pMessageTarget =
nullptr;
90 std::shared_ptr<ChartTableEntryJobTicket> m_ticket;
120class OCPN_ChartTableEntryThreadEvent :
public wxEvent {
122 OCPN_ChartTableEntryThreadEvent(wxEventType type) : wxEvent(0, type) {}
124 wxEvent* Clone()
const override {
125 return new OCPN_ChartTableEntryThreadEvent(*
this);
128 void SetTicket(std::shared_ptr<ChartTableEntryJobTicket> t) {
129 m_ticket = std::move(t);
131 std::shared_ptr<ChartTableEntryJobTicket> GetTicket()
const {
136 std::shared_ptr<ChartTableEntryJobTicket> m_ticket;
147 void Push(std::shared_ptr<ChartTableEntryJobTicket> job) {
148 std::lock_guard<std::mutex> lock(m_mutex);
154 bool Pop(std::shared_ptr<ChartTableEntryJobTicket>& job) {
155 std::unique_lock<std::mutex> lock(m_mutex);
156 m_cv.wait(lock, [&] {
return !m_queue.empty() || m_shutdown; });
158 if (m_shutdown && m_queue.empty())
return false;
160 job = m_queue.front();
166 std::lock_guard<std::mutex> lock(m_mutex);
173 void AddWorker() { n_workers++; }
174 int GetWorkerCount() {
return n_workers; }
175 std::atomic<int> pending_events{0};
178 std::queue<std::shared_ptr<ChartTableEntryJobTicket>> m_queue;
180 std::condition_variable m_cv;
181 bool m_shutdown =
false;
191class PoolWorkerThread :
public wxThread {
193 PoolWorkerThread(
JobQueueCTE& queue, wxEvtHandler* target)
194 : wxThread(wxTHREAD_DETACHED), m_queue(queue), m_target(target) {
195 printf(
"New thread\n");
199 ExitCode Entry()
override {
200 std::shared_ptr<ChartTableEntryJobTicket> job;
202 while (m_queue.Pop(job)) {
204 while (m_queue.pending_events.load(std::memory_order_relaxed) >
205 kMAX_EVENT_THROTTLE) {
210 job->b_isaborted =
true;
211 printf(
"job aborted\n");
218 wxQueueEvent(m_target, evt);
219 m_queue.pending_events++;
227 wxEvtHandler* m_target;