Skip to content

Commit aa9ecc2

Browse files
author
Felix Exner
committed
Added a running member to actually join the RTDEWriter thread
1 parent 02ceb92 commit aa9ecc2

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

ur_robot_driver/include/ur_robot_driver/rtde/rtde_writer.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,16 @@ class RTDEWriter
5555
* \param recipe The recipe to use for communication
5656
*/
5757
RTDEWriter(comm::URStream<RTDEPackage>* stream, const std::vector<std::string>& recipe);
58-
~RTDEWriter() = default;
58+
59+
~RTDEWriter()
60+
{
61+
running_ = false;
62+
std::this_thread::sleep_for(std::chrono::seconds(5));
63+
if (writer_thread_.joinable())
64+
{
65+
writer_thread_.join();
66+
}
67+
}
5968
/*!
6069
* \brief Starts the writer thread, which periodically clears the queue to write packages to the
6170
* robot.
@@ -120,6 +129,7 @@ class RTDEWriter
120129
uint8_t recipe_id_;
121130
moodycamel::BlockingReaderWriterQueue<std::unique_ptr<DataPackage>> queue_;
122131
std::thread writer_thread_;
132+
bool running_;
123133
};
124134

125135
} // namespace rtde_interface

ur_robot_driver/src/rtde/rtde_writer.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,14 @@ namespace ur_driver
3232
namespace rtde_interface
3333
{
3434
RTDEWriter::RTDEWriter(comm::URStream<RTDEPackage>* stream, const std::vector<std::string>& recipe)
35-
: stream_(stream), recipe_(recipe), queue_{ 32 }
35+
: stream_(stream), recipe_(recipe), queue_{ 32 }, running_(false)
3636
{
3737
}
3838

3939
void RTDEWriter::init(uint8_t recipe_id)
4040
{
4141
recipe_id_ = recipe_id;
42+
running_ = true;
4243
writer_thread_ = std::thread(&RTDEWriter::run, this);
4344
}
4445

@@ -48,13 +49,16 @@ void RTDEWriter::run()
4849
size_t size;
4950
size_t written;
5051
std::unique_ptr<DataPackage> package;
51-
while (true)
52+
while (running_)
5253
{
53-
queue_.waitDequeue(package);
54-
package->setRecipeID(recipe_id_);
55-
size = package->serializePackage(buffer);
56-
stream_->write(buffer, size, written);
54+
if (queue_.waitDequeTimed(package, 1000000))
55+
{
56+
package->setRecipeID(recipe_id_);
57+
size = package->serializePackage(buffer);
58+
stream_->write(buffer, size, written);
59+
}
5760
}
61+
LOG_DEBUG("Write thread ended.");
5862
}
5963

6064
bool RTDEWriter::sendSpeedSlider(double speed_slider_fraction)

0 commit comments

Comments
 (0)