diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2021-10-02 00:00:43 +0200 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2021-10-02 00:01:38 +0200 | 
| commit | 16497b0362244407a139479b6e15834cf709779c (patch) | |
| tree | f30648421d0ec4978a9d5242730cb9930c4a5150 | |
| parent | a42a6ec0d7f99de0aabf9c9732303ded426e843f (diff) | |
tracker/pt: fix rare crash due to QProcess use across threads
This was caused by QProcess in video/ps3eye getting created from the UI
thread, then recreated on the Point Tracker's thread.
| -rw-r--r-- | tracker-pt/ftnoir_tracker_pt.cpp | 37 | ||||
| -rw-r--r-- | tracker-pt/ftnoir_tracker_pt.h | 2 | 
2 files changed, 20 insertions, 19 deletions
| diff --git a/tracker-pt/ftnoir_tracker_pt.cpp b/tracker-pt/ftnoir_tracker_pt.cpp index 93074883..b996448b 100644 --- a/tracker-pt/ftnoir_tracker_pt.cpp +++ b/tracker-pt/ftnoir_tracker_pt.cpp @@ -28,16 +28,12 @@ Tracker_PT::Tracker_PT(pointer<pt_runtime_traits> const& traits) :      traits { traits },      s { traits->get_module_name() },      point_extractor { traits->make_point_extractor() }, -    camera { traits->make_camera() },      frame { traits->make_frame() }  {      opencv_init(); -    connect(s.b.get(), &bundle_::saving, this, &Tracker_PT::maybe_reopen_camera, Qt::DirectConnection); -    connect(s.b.get(), &bundle_::reloading, this, &Tracker_PT::maybe_reopen_camera, Qt::DirectConnection); - +    connect(s.b.get(), &bundle_::saving, this, [this]{ reopen_camera_flag = true; }, Qt::DirectConnection);      connect(&s.fov, value_::value_changed<int>(), this, &Tracker_PT::set_fov, Qt::DirectConnection); -    set_fov(s.fov);  }  Tracker_PT::~Tracker_PT() @@ -53,11 +49,21 @@ void Tracker_PT::run()  {      portable::set_curthread_name("tracker/pt"); -    if (!maybe_reopen_camera()) -        return; -      while(!isInterruptionRequested())      { +        if (reopen_camera_flag) +        { +            reopen_camera_flag = false; +            if (camera) +                camera->stop(); +            camera = traits->make_camera(); +            set_fov(s.fov); +            { +                QMutexLocker l(&camera_mtx); +                (void)camera->start(s); +            } +        } +          pt_camera_info info;          bool new_frame = false; @@ -111,17 +117,11 @@ void Tracker_PT::run()      }  } -bool Tracker_PT::maybe_reopen_camera() -{ -    QMutexLocker l(&camera_mtx); - -    return camera->start(s); -} -  void Tracker_PT::set_fov(int value)  {      QMutexLocker l(&camera_mtx); -    camera->set_fov(value); +    if (camera) +        camera->set_fov(value);  }  module_status Tracker_PT::start_tracker(QFrame* video_frame) @@ -206,9 +206,10 @@ int Tracker_PT::get_n_points()  bool Tracker_PT::get_cam_info(pt_camera_info& info)  {      QMutexLocker l(&camera_mtx); -    bool ret; +    bool ret = false; -    std::tie(ret, info) = camera->get_info(); +    if (camera) +        std::tie(ret, info) = camera->get_info();      return ret;  } diff --git a/tracker-pt/ftnoir_tracker_pt.h b/tracker-pt/ftnoir_tracker_pt.h index fa3d94ad..50e51405 100644 --- a/tracker-pt/ftnoir_tracker_pt.h +++ b/tracker-pt/ftnoir_tracker_pt.h @@ -50,7 +50,6 @@ struct Tracker_PT : QThread, ITracker  private:      void run() override; -    bool maybe_reopen_camera();      void set_fov(int value);      pointer<pt_runtime_traits> traits; @@ -74,6 +73,7 @@ private:      std::atomic<unsigned> point_count { 0 };      std::atomic<bool> ever_success = false; +    std::atomic<bool> reopen_camera_flag = true;      mutable QMutex center_lock, data_lock;      point_filter filter{s};  }; | 
