Merge pull request #5846 from ameerj/analog-join
analog_from_button: Fix update_thread.join exception
This commit is contained in:
		| @@ -2,6 +2,7 @@ | |||||||
| // Licensed under GPLv2 or any later version | // Licensed under GPLv2 or any later version | ||||||
| // Refer to the license.txt file included. | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #include <atomic> | ||||||
| #include <chrono> | #include <chrono> | ||||||
| #include <cmath> | #include <cmath> | ||||||
| #include <thread> | #include <thread> | ||||||
| @@ -20,15 +21,18 @@ public: | |||||||
|         : up(std::move(up_)), down(std::move(down_)), left(std::move(left_)), |         : up(std::move(up_)), down(std::move(down_)), left(std::move(left_)), | ||||||
|           right(std::move(right_)), modifier(std::move(modifier_)), modifier_scale(modifier_scale_), |           right(std::move(right_)), modifier(std::move(modifier_)), modifier_scale(modifier_scale_), | ||||||
|           modifier_angle(modifier_angle_) { |           modifier_angle(modifier_angle_) { | ||||||
|  |         update_thread_running.store(true); | ||||||
|         update_thread = std::thread(&Analog::UpdateStatus, this); |         update_thread = std::thread(&Analog::UpdateStatus, this); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ~Analog() override { |     ~Analog() override { | ||||||
|         update_thread_running = false; |         if (update_thread_running.load()) { | ||||||
|  |             update_thread_running.store(false); | ||||||
|             if (update_thread.joinable()) { |             if (update_thread.joinable()) { | ||||||
|                 update_thread.join(); |                 update_thread.join(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     void MoveToDirection(bool enable, float to_angle) { |     void MoveToDirection(bool enable, float to_angle) { | ||||||
|         if (!enable) { |         if (!enable) { | ||||||
| @@ -58,7 +62,7 @@ public: | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     void UpdateStatus() { |     void UpdateStatus() { | ||||||
|         while (update_thread_running) { |         while (update_thread_running.load()) { | ||||||
|             const float coef = modifier->GetStatus() ? modifier_scale : 1.0f; |             const float coef = modifier->GetStatus() ? modifier_scale : 1.0f; | ||||||
|  |  | ||||||
|             bool r = right->GetStatus(); |             bool r = right->GetStatus(); | ||||||
| @@ -160,7 +164,7 @@ private: | |||||||
|     float angle{}; |     float angle{}; | ||||||
|     float amplitude{}; |     float amplitude{}; | ||||||
|     std::thread update_thread; |     std::thread update_thread; | ||||||
|     bool update_thread_running{true}; |     std::atomic<bool> update_thread_running{}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| std::unique_ptr<Input::AnalogDevice> AnalogFromButton::Create(const Common::ParamPackage& params) { | std::unique_ptr<Input::AnalogDevice> AnalogFromButton::Create(const Common::ParamPackage& params) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Morph
					Morph