mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 08:50:05 +00:00 
			
		
		
		
	Schedule alert layer refresh at least once per minute to avoid stale warning boxes
This commit is contained in:
		
							parent
							
								
									e8a0cf5fa9
								
							
						
					
					
						commit
						f753f3aa92
					
				
					 1 changed files with 47 additions and 0 deletions
				
			
		|  | @ -13,6 +13,8 @@ | ||||||
| #include <unordered_set> | #include <unordered_set> | ||||||
| 
 | 
 | ||||||
| #include <boost/algorithm/string/join.hpp> | #include <boost/algorithm/string/join.hpp> | ||||||
|  | #include <boost/asio/system_timer.hpp> | ||||||
|  | #include <boost/asio/thread_pool.hpp> | ||||||
| #include <boost/container/stable_vector.hpp> | #include <boost/container/stable_vector.hpp> | ||||||
| #include <boost/container_hash/hash.hpp> | #include <boost/container_hash/hash.hpp> | ||||||
| #include <QEvent> | #include <QEvent> | ||||||
|  | @ -129,9 +131,16 @@ public: | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       ConnectSignals(); |       ConnectSignals(); | ||||||
|  |       ScheduleRefresh(); | ||||||
|    } |    } | ||||||
|    ~Impl() |    ~Impl() | ||||||
|    { |    { | ||||||
|  |       std::unique_lock refreshLock(refreshMutex_); | ||||||
|  |       refreshTimer_.cancel(); | ||||||
|  |       refreshLock.unlock(); | ||||||
|  | 
 | ||||||
|  |       threadPool_.join(); | ||||||
|  | 
 | ||||||
|       receiver_ = nullptr; |       receiver_ = nullptr; | ||||||
| 
 | 
 | ||||||
|       std::unique_lock lock(linesMutex_); |       std::unique_lock lock(linesMutex_); | ||||||
|  | @ -147,6 +156,7 @@ public: | ||||||
|                             QEvent*                                     ev); |                             QEvent*                                     ev); | ||||||
|    void HandleGeoLinesHover(std::shared_ptr<gl::draw::GeoLineDrawItem>& di, |    void HandleGeoLinesHover(std::shared_ptr<gl::draw::GeoLineDrawItem>& di, | ||||||
|                             const QPointF& mouseGlobalPos); |                             const QPointF& mouseGlobalPos); | ||||||
|  |    void ScheduleRefresh(); | ||||||
| 
 | 
 | ||||||
|    void AddLine(std::shared_ptr<gl::draw::GeoLines>&        geoLines, |    void AddLine(std::shared_ptr<gl::draw::GeoLines>&        geoLines, | ||||||
|                 std::shared_ptr<gl::draw::GeoLineDrawItem>& di, |                 std::shared_ptr<gl::draw::GeoLineDrawItem>& di, | ||||||
|  | @ -167,8 +177,13 @@ public: | ||||||
|                  boost::container::stable_vector< |                  boost::container::stable_vector< | ||||||
|                     std::shared_ptr<gl::draw::GeoLineDrawItem>>& drawItems); |                     std::shared_ptr<gl::draw::GeoLineDrawItem>>& drawItems); | ||||||
| 
 | 
 | ||||||
|  |    boost::asio::thread_pool threadPool_ {1u}; | ||||||
|  | 
 | ||||||
|    AlertLayer* self_; |    AlertLayer* self_; | ||||||
| 
 | 
 | ||||||
|  |    boost::asio::system_timer refreshTimer_ {threadPool_}; | ||||||
|  |    std::mutex                refreshMutex_; | ||||||
|  | 
 | ||||||
|    const awips::Phenomenon phenomenon_; |    const awips::Phenomenon phenomenon_; | ||||||
| 
 | 
 | ||||||
|    std::unique_ptr<QObject> receiver_ {std::make_unique<QObject>()}; |    std::unique_ptr<QObject> receiver_ {std::make_unique<QObject>()}; | ||||||
|  | @ -387,6 +402,38 @@ void AlertLayer::Impl::ConnectSignals() | ||||||
|                     { selectedTime_ = dateTime; }); |                     { selectedTime_ = dateTime; }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void AlertLayer::Impl::ScheduleRefresh() | ||||||
|  | { | ||||||
|  |    using namespace std::chrono_literals; | ||||||
|  | 
 | ||||||
|  |    // Take a unique lock before refreshing
 | ||||||
|  |    std::unique_lock lock(refreshMutex_); | ||||||
|  | 
 | ||||||
|  |    // Expires at the top of the next minute
 | ||||||
|  |    std::chrono::system_clock::time_point now = | ||||||
|  |       std::chrono::floor<std::chrono::minutes>( | ||||||
|  |          std::chrono::system_clock::now()); | ||||||
|  |    refreshTimer_.expires_at(now + 1min); | ||||||
|  | 
 | ||||||
|  |    refreshTimer_.async_wait( | ||||||
|  |       [this](const boost::system::error_code& e) | ||||||
|  |       { | ||||||
|  |          if (e == boost::asio::error::operation_aborted) | ||||||
|  |          { | ||||||
|  |             logger_->debug("Refresh timer cancelled"); | ||||||
|  |          } | ||||||
|  |          else if (e != boost::system::errc::success) | ||||||
|  |          { | ||||||
|  |             logger_->warn("Refresh timer error: {}", e.message()); | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             Q_EMIT self_->NeedsRendering(); | ||||||
|  |             ScheduleRefresh(); | ||||||
|  |          } | ||||||
|  |       }); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void AlertLayer::Impl::AddAlert( | void AlertLayer::Impl::AddAlert( | ||||||
|    const std::shared_ptr<AlertLayerHandler::SegmentRecord>& segmentRecord) |    const std::shared_ptr<AlertLayerHandler::SegmentRecord>& segmentRecord) | ||||||
| { | { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat