From ffe4052832e2110b7f77d0b0de241a11443c3847 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Mon, 16 Mar 2020 11:46:49 +0100 Subject: [PATCH] [threading] ensure threads are terminated before exiting --- pylonrecorder.cpp | 8 ++++++++ writer.cpp | 5 +++-- writer.h | 6 +++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/pylonrecorder.cpp b/pylonrecorder.cpp index b8c4900..10aa50a 100644 --- a/pylonrecorder.cpp +++ b/pylonrecorder.cpp @@ -93,6 +93,14 @@ PylonRecorder::PylonRecorder(QWidget *parent) } PylonRecorder::~PylonRecorder(){ + if (grabber->isRunning()) { + grabber->requestStop(); + grabber->wait(1000); + } + if (writer->isRunning()) { + writer->forceStop(); + writer->wait(1000); + } delete pylon; delete buffer; delete grabber; diff --git a/writer.cpp b/writer.cpp index 87d09f1..d47e0a4 100644 --- a/writer.cpp +++ b/writer.cpp @@ -9,12 +9,13 @@ void Writer::run() { int64_t count = 0; if (valid) { stop_request = false; + stopNow = false; Pylon::CVideoWriter videoWriter; videoWriter.SetParameter(videoSpecs.width, videoSpecs.height, videoSpecs.pixelType, videoSpecs.fps, videoSpecs.quality); videoWriter.Open(videoSpecs.filename.c_str()); MyImage img; - while (!stop_request || buffer->bufferLoad() > 0) { + while ((!stop_request || buffer->bufferLoad() > 0) && !stopNow) { if (buffer->bufferLoad() > 0 ) { bool valid = buffer->pop(img); if (valid) { @@ -32,7 +33,7 @@ void Writer::run() { msleep(10); } } - } + } videoWriter.Close(); } else { std::cerr << "Got no video specifications, not writing!" << std::endl; diff --git a/writer.h b/writer.h index f87b222..673b365 100644 --- a/writer.h +++ b/writer.h @@ -33,13 +33,17 @@ signals: private: ImageBuffer *buffer; VideoSpecs videoSpecs; - bool stop_request = false; + bool stop_request = false, stopNow = false; bool valid = false; public slots: void requestStop() { stop_request=true; } + + void forceStop() { + stopNow = true; + } }; #endif // WRITER_H