Do interruption of ThreadStaticText properly.
authorCarl Hetherington <cth@carlh.net>
Sat, 22 Sep 2012 13:01:43 +0000 (14:01 +0100)
committerCarl Hetherington <cth@carlh.net>
Sat, 22 Sep 2012 13:01:43 +0000 (14:01 +0100)
src/lib/film.cc
src/lib/film.h
src/wx/properties_dialog.cc
src/wx/wx_util.cc

index 92b91d0ac60901abf1c36764ed9adff70a0905ab..d5327aa3a18bea1630510bce6fb05bf3c4b8280b 100644 (file)
@@ -647,6 +647,12 @@ Film::encoded_frames () const
        if (format() == 0) {
                return 0;
        }
-       
-       return distance (filesystem::directory_iterator (j2k_dir()), filesystem::directory_iterator ());
+
+       int N = 0;
+       for (filesystem::directory_iterator i = filesystem::directory_iterator (j2k_dir ()); i != filesystem::directory_iterator(); ++i) {
+               ++N;
+               this_thread::interruption_point ();
+       }
+
+       return N;
 }
index 40aa7b0f6617deaa85c18a65852953e223e9e50d..cd3b1b8a8dac19c830c088bc383afbb5cbadad4f 100644 (file)
@@ -29,6 +29,7 @@
 #include <vector>
 #include <inttypes.h>
 #include <boost/thread/mutex.hpp>
+#include <boost/thread.hpp>
 #include <sigc++/signal.h>
 extern "C" {
 #include <libavcodec/avcodec.h>
index 0a997bc41ce73fb1caf5bd3e1566558277e4fc39..e6c6c9f81bd418d64045b0686b5b4dfea52e732b 100644 (file)
@@ -76,7 +76,12 @@ string
 PropertiesDialog::frames_already_encoded () const
 {
        stringstream u;
-       u << _film->encoded_frames();
+       try {
+               u << _film->encoded_frames ();
+       } catch (thread_interrupted &) {
+               return "";
+       }
+       
        if (_film->length()) {
                u << " (" << (_film->encoded_frames() * 100 / _film->length()) << "%)";
        }
index 712e235700b5776a5dc18bedba260775795bed0a..44d9462e504404e1379111eb5effdc59cfb2aac3 100644 (file)
@@ -70,7 +70,7 @@ ThreadedStaticText::ThreadedStaticText (wxWindow* parent, string initial, functi
 
 ThreadedStaticText::~ThreadedStaticText ()
 {
-       /* XXX: this is a bit unfortunate */
+       _thread->interrupt ();
        _thread->join ();
        delete _thread;
 }