#include <dcp/exceptions.h>
#include <boost/thread.hpp>
#include <boost/filesystem.hpp>
+#include <iostream>
#include "i18n.h"
using std::cout;
using boost::shared_ptr;
using boost::optional;
+using boost::function;
-#define LOG_ERROR_NC(...) _film->log()->log (__VA_ARGS__, Log::TYPE_ERROR);
+#define LOG_ERROR_NC(...) _film->log()->log (__VA_ARGS__, LogEntry::TYPE_ERROR);
+#define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL);
+/** @param film Associated film, or 0 */
Job::Job (shared_ptr<const Film> film)
: _film (film)
, _thread (0)
}
+Job::~Job ()
+{
+ if (_thread) {
+ _thread->interrupt ();
+ DCPOMATIC_ASSERT (_thread->joinable ());
+ _thread->join ();
+ }
+
+ delete _thread;
+}
+
/** Start the job in a separate thread, returning immediately */
void
Job::start ()
set_error (
String::compose (_("Could not open %1"), e.file().string()),
- String::compose (_("DCP-o-matic could not open the file %1. Perhaps it does not exist or is in an unexpected format."), e.file().string())
+ String::compose (
+ _("DCP-o-matic could not open the file %1. Perhaps it does not exist or is in an unexpected format."),
+ boost::filesystem::absolute (e.file()).string()
+ )
);
set_progress (1);
if (e.code() == boost::system::errc::no_such_file_or_directory) {
set_error (
String::compose (_("Could not open %1"), e.path1().string ()),
- String::compose (_("DCP-o-matic could not open the file %1. Perhaps it does not exist or is in an unexpected format."), e.path1().string())
+ String::compose (
+ _("DCP-o-matic could not open the file %1. Perhaps it does not exist or is in an unexpected format."),
+ boost::filesystem::absolute (e.path1()).string()
+ )
);
} else {
set_error (
} catch (std::bad_alloc& e) {
- set_error (_("Out of memory"), _("There was not enough memory to do this."));
+ set_error (_("Out of memory"), _("There was not enough memory to do this. If you are running a 32-bit operating system try reducing the number of encoding threads in the General tab of Preferences."));
set_progress (1);
set_state (FINISHED_ERROR);
return;
}
+ set_progress_common (p);
+}
+
+void
+Job::set_progress_common (optional<float> p)
+{
boost::mutex::scoped_lock lm (_progress_mutex);
_progress = p;
boost::this_thread::interruption_point ();
{
{
boost::mutex::scoped_lock lm (_progress_mutex);
+ LOG_GENERAL ("Sub-job %1 starting", n);
_sub_name = n;
}
void
Job::set_error (string s, string d)
{
- LOG_ERROR_NC (s);
- LOG_ERROR_NC (d);
+ if (_film) {
+ LOG_ERROR_NC (s);
+ LOG_ERROR_NC (d);
+ _film->log()->log (String::compose ("Error in job: %1 (%2)", s, d), LogEntry::TYPE_ERROR);
+ }
- _film->log()->log (String::compose ("Error in job: %1 (%2)", s, d), Log::TYPE_ERROR);
boost::mutex::scoped_lock lm (_state_mutex);
_error_summary = s;
_error_details = d;
void
Job::set_progress_unknown ()
{
- boost::mutex::scoped_lock lm (_progress_mutex);
- _progress.reset ();
- lm.unlock ();
-
- emit (boost::bind (boost::ref (Progress)));
+ set_progress_common (optional<float> ());
}
/** @return Human-readable status of this job */
}
_thread->interrupt ();
+ DCPOMATIC_ASSERT (_thread->joinable ());
_thread->join ();
+ delete _thread;
+ _thread = 0;
}
void
_pause_changed.notify_all ();
}
}
+
+void
+Job::when_finished (boost::signals2::connection& connection, function<void()> finished)
+{
+ boost::mutex::scoped_lock lm (_state_mutex);
+ if (_state == FINISHED_OK || _state == FINISHED_ERROR || _state == FINISHED_CANCELLED) {
+ finished ();
+ } else {
+ connection = Finished.connect (finished);
+ }
+}