From 19556e0f1bb854fffffc7d473dea5335c85c667a Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 24 Oct 2014 23:26:18 +0100 Subject: [PATCH] Fix job pausing to actually work, and always add Pause buttons to JobManagerViews (part of #344). --- src/lib/job.cc | 7 +++++-- src/lib/job.h | 5 +++++ src/tools/dcpomatic.cc | 2 +- src/tools/dcpomatic_batch.cc | 2 +- src/wx/job_manager_view.cc | 29 +++++++++-------------------- src/wx/job_manager_view.h | 7 +------ 6 files changed, 22 insertions(+), 30 deletions(-) diff --git a/src/lib/job.cc b/src/lib/job.cc index 52ec1426c..52276c0ea 100644 --- a/src/lib/job.cc +++ b/src/lib/job.cc @@ -230,8 +230,9 @@ Job::set_progress (float p, bool force) _progress = p; boost::this_thread::interruption_point (); - if (paused ()) { - dcpomatic_sleep (1); + boost::mutex::scoped_lock lm2 (_state_mutex); + while (_state == PAUSED) { + _pause_changed.wait (lm2); } if (ui_signaller) { @@ -348,6 +349,7 @@ Job::pause () { if (running ()) { set_state (PAUSED); + _pause_changed.notify_all (); } } @@ -356,5 +358,6 @@ Job::resume () { if (paused ()) { set_state (RUNNING); + _pause_changed.notify_all (); } } diff --git a/src/lib/job.h b/src/lib/job.h index 97e3fc296..b7dfc5891 100644 --- a/src/lib/job.h +++ b/src/lib/job.h @@ -125,6 +125,11 @@ private: mutable boost::mutex _progress_mutex; boost::optional _progress; + /** condition to signal changes to pause/resume so that we know when to wake; + this could be a general _state_change if it made more sense. + */ + boost::condition_variable _pause_changed; + int _ran_for; }; diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index fe3a43f71..c22253062 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -201,7 +201,7 @@ public: _film_editor = new FilmEditor (overall_panel); _film_viewer = new FilmViewer (overall_panel); - JobManagerView* job_manager_view = new JobManagerView (overall_panel, static_cast (0)); + JobManagerView* job_manager_view = new JobManagerView (overall_panel); wxBoxSizer* right_sizer = new wxBoxSizer (wxVERTICAL); right_sizer->Add (_film_viewer, 2, wxEXPAND | wxALL, 6); diff --git a/src/tools/dcpomatic_batch.cc b/src/tools/dcpomatic_batch.cc index de255e65e..b92ca5d71 100644 --- a/src/tools/dcpomatic_batch.cc +++ b/src/tools/dcpomatic_batch.cc @@ -77,7 +77,7 @@ public: s->Add (panel, 1, wxEXPAND); SetSizer (s); - JobManagerView* job_manager_view = new JobManagerView (panel, JobManagerView::PAUSE); + JobManagerView* job_manager_view = new JobManagerView (panel); _sizer->Add (job_manager_view, 1, wxALL | wxEXPAND, 6); wxSizer* buttons = new wxBoxSizer (wxHORIZONTAL); diff --git a/src/wx/job_manager_view.cc b/src/wx/job_manager_view.cc index 5146243b4..b62d44d07 100644 --- a/src/wx/job_manager_view.cc +++ b/src/wx/job_manager_view.cc @@ -39,12 +39,11 @@ using boost::weak_ptr; class JobRecord { public: - JobRecord (shared_ptr job, wxScrolledWindow* window, wxPanel* panel, wxFlexGridSizer* table, bool pause) + JobRecord (shared_ptr job, wxScrolledWindow* window, wxPanel* panel, wxFlexGridSizer* table) : _job (job) , _window (window) , _panel (panel) , _table (table) - , _pause (0) { int n = 0; @@ -69,12 +68,10 @@ public: table->Insert (n, _cancel, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); ++n; - if (pause) { - _pause = new wxButton (_panel, wxID_ANY, _("Pause")); - _pause->Bind (wxEVT_COMMAND_BUTTON_CLICKED, &JobRecord::pause_clicked, this); - table->Insert (n, _pause, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); - ++n; - } + _pause = new wxButton (_panel, wxID_ANY, _("Pause")); + _pause->Bind (wxEVT_COMMAND_BUTTON_CLICKED, &JobRecord::pause_clicked, this); + table->Insert (n, _pause, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); + ++n; _details = new wxButton (_panel, wxID_ANY, _("Details...")); _details->Bind (wxEVT_COMMAND_BUTTON_CLICKED, &JobRecord::details_clicked, this); @@ -135,9 +132,7 @@ private: } _cancel->Enable (false); - if (_pause) { - _pause->Enable (false); - } + _pause->Enable (false); if (!_job->error_details().empty ()) { _details->Enable (true); } @@ -183,21 +178,15 @@ private: }; /** Must be called in the GUI thread */ -JobManagerView::JobManagerView (wxWindow* parent, Buttons buttons) +JobManagerView::JobManagerView (wxWindow* parent) : wxScrolledWindow (parent) - , _buttons (buttons) { _panel = new wxPanel (this); wxSizer* sizer = new wxBoxSizer (wxVERTICAL); sizer->Add (_panel, 1, wxEXPAND); SetSizer (sizer); - int N = 5; - if (buttons & PAUSE) { - ++N; - } - - _table = new wxFlexGridSizer (N, 6, 6); + _table = new wxFlexGridSizer (6, 6, 6); _table->AddGrowableCol (1, 1); _panel->SetSizer (_table); @@ -225,7 +214,7 @@ JobManagerView::job_added (weak_ptr j) { shared_ptr job = j.lock (); if (job) { - _job_records.push_back (shared_ptr (new JobRecord (job, this, _panel, _table, _buttons & PAUSE))); + _job_records.push_back (shared_ptr (new JobRecord (job, this, _panel, _table))); } } diff --git a/src/wx/job_manager_view.h b/src/wx/job_manager_view.h index 83ce4ee5a..fde9199ff 100644 --- a/src/wx/job_manager_view.h +++ b/src/wx/job_manager_view.h @@ -34,11 +34,7 @@ class JobRecord; class JobManagerView : public wxScrolledWindow { public: - enum Buttons { - PAUSE = 0x1, - }; - - JobManagerView (wxWindow *, Buttons); + JobManagerView (wxWindow *); private: void job_added (boost::weak_ptr); @@ -50,5 +46,4 @@ private: boost::shared_ptr _timer; std::list > _job_records; - Buttons _buttons; }; -- 2.30.2