38#include "s57class_registrar.h"
46SENCJobTicket::SENCJobTicket() {
47 m_SENCResult = SENC_BUILD_INACTIVE;
48 m_status = THREAD_INACTIVE;
56OCPN_BUILDSENC_ThreadEvent::OCPN_BUILDSENC_ThreadEvent(wxEventType commandType,
58 : wxEvent(id, commandType) {
62OCPN_BUILDSENC_ThreadEvent::~OCPN_BUILDSENC_ThreadEvent() {}
64wxEvent *OCPN_BUILDSENC_ThreadEvent::Clone()
const {
66 newevent->stat = this->stat;
67 newevent->type = this->type;
68 newevent->m_ticket = this->m_ticket;
76SENCThreadManager::SENCThreadManager() {
79 int nCPU = wxMax(1, wxThread::GetCPUCount());
80 if (g_nCPUCount > 0) nCPU = g_nCPUCount;
83 if (nCPU < 1) nCPU = 1;
85 m_max_jobs = wxMax(nCPU - 1, 1);
88 wxLogDebug(
"SENC: nCPU: %d m_max_jobs :%d\n", nCPU, m_max_jobs);
94 (wxObjectEventFunction)(wxEventFunction)&SENCThreadManager::OnEvtThread);
100SENCThreadManager::~SENCThreadManager() {
104SENCThreadStatus SENCThreadManager::ScheduleJob(
SENCJobTicket *ticket) {
106 for (
size_t i = 0; i < ticket_list.size(); i++) {
107 if (ticket_list[i]->m_FullPath000 == ticket->m_FullPath000)
108 return THREAD_PENDING;
111 ticket->m_status = THREAD_PENDING;
112 ticket_list.push_back(ticket);
118 return THREAD_PENDING;
121void SENCThreadManager::StartTopJob() {
125 for (
size_t i = 0; i < ticket_list.size(); i++) {
126 if (ticket_list[i]->m_status == THREAD_STARTED) nRunning++;
130 if (nRunning < m_max_jobs) {
132 startCandidate = NULL;
133 for (
size_t i = 0; i < ticket_list.size(); i++) {
134 if (ticket_list[i]->m_status == THREAD_PENDING) {
135 startCandidate = ticket_list[i];
141 if (startCandidate) {
146 startCandidate->m_thread = thread;
147 startCandidate->m_status = THREAD_STARTED;
148 thread->SetPriority(20);
156 count.Printf(
" %ld",
static_cast<long>(ticket_list.size()));
157 if (
auto tfPtr = top_frame::Get()) {
158 tfPtr->SetAlertString(_(
"Preparing vector chart ") + count);
168 for (
size_t i = 0; i < ticket_list.size(); i++) {
169 if (ticket_list[i] == ticket) {
173 ticket_list.erase(ticket_list.begin() + i);
182 for (
size_t i = 0; i < ticket_list.size(); i++) {
183 if (ticket_list[i]->m_status == THREAD_STARTED) nRunning++;
188 count.Printf(
" %ld",
static_cast<long>(ticket_list.size()));
189 if (
auto tfPtr = top_frame::Get()) {
190 tfPtr->SetAlertString(_(
"Preparing vector chart ") + count);
193 if (
auto tfPtr = top_frame::Get()) {
194 tfPtr->SetAlertString(
"");
200int SENCThreadManager::GetJobCount() {
return ticket_list.size(); }
202bool SENCThreadManager::IsChartInTicketlist(
s57chart *chart) {
203 for (
size_t i = 0; i < ticket_list.size(); i++) {
204 if (ticket_list[i]->m_chart == chart)
return true;
209bool SENCThreadManager::SetChartPointer(
s57chart *chart,
void *new_ptr) {
211 for (
size_t i = 0; i < ticket_list.size(); i++) {
212 if (ticket_list[i]->m_chart == chart) {
213 ticket_list[i]->m_chart = (
s57chart *)new_ptr;
220#define NBAR_LENGTH 40
225 switch (event.type) {
226 case SENC_BUILD_STARTED:
228 Sevent.type = SENC_BUILD_STARTED;
229 Sevent.m_ticket =
event.m_ticket;
232 case SENC_BUILD_DONE_NOERROR:
234 Sevent.type = SENC_BUILD_DONE_NOERROR;
235 Sevent.m_ticket =
event.m_ticket;
236 FinishJob(event.m_ticket);
240 case SENC_BUILD_DONE_ERROR:
242 Sevent.type = SENC_BUILD_DONE_ERROR;
243 Sevent.m_ticket =
event.m_ticket;
244 FinishJob(event.m_ticket);
251 if (top_frame::Get())
252 top_frame::Get()->GetEventHandler()->AddPendingEvent(Sevent);
261 m_FullPath000 = ticket->m_FullPath000;
262 m_SENCFileName = ticket->m_SENCFileName;
269void *SENCBuildThread::Entry() {
284 senc.setRegistrar(g_poRegistrar);
285 senc.setRefLocn(m_ticket->ref_lat, m_ticket->ref_lon);
286 senc.SetLODMeters(m_ticket->m_LOD_meters);
287 senc.setNoErrDialog(
true);
289 m_ticket->m_SENCResult = SENC_BUILD_STARTED;
292 Sevent.type = SENC_BUILD_STARTED;
293 Sevent.m_ticket = m_ticket;
294 if (m_manager) m_manager->QueueEvent(Sevent.Clone());
296 int ret = senc.createSenc200(m_FullPath000, m_SENCFileName,
false);
300 Nevent.m_ticket = m_ticket;
301 if (ret == ERROR_INGESTING000)
302 Nevent.type = SENC_BUILD_DONE_ERROR;
304 Nevent.type = SENC_BUILD_DONE_NOERROR;
306 m_ticket->m_SENCResult = Sevent.type;
307 if (m_manager) m_manager->QueueEvent(Nevent.Clone());
318 catch (
const std::exception &e ) {
319 const char *msg = e.what();
General chart base definitions.
Generic Chart canvas base.
Manager for S57 chart SENC creation threads.
Represents an S57 format electronic navigational chart in OpenCPN.
Global variables stored in configuration file.
const wxEventType wxEVT_OCPN_BUILDSENCTHREAD
Global instance.
SENCThreadManager * g_SencThreadManager
Global instance.
const wxEventType wxEVT_OCPN_BUILDSENCTHREAD
Global instance.
Abstract gFrame/MyFrame interface.