From dde6fc0786d150977ab4b8fa7e27ff369a70a609 Mon Sep 17 00:00:00 2001 From: ArsenArsen Date: Tue, 13 Jun 2017 18:23:33 +0200 Subject: [PATCH] This is why I needed bug testing Fix a race condition and logic error --- mainwindow.cpp | 1 + recording/recordingcontroller.cpp | 2 ++ recording/recordingcontroller.hpp | 2 ++ recording/recordingformats.cpp | 12 +++++++++--- recording/recordingformats.hpp | 2 ++ 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index c4ba9ce..6443db0 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -100,6 +100,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi ctx->finalizer = format->getFinalizer(); ctx->validator = format->getValidator(); ctx->format = format->getFormat(); + ctx->postUploadTask = format->getPostUploadTask(); ctx->anotherFormat = format->getAnotherFormat(); controller->start(ctx); }); diff --git a/recording/recordingcontroller.cpp b/recording/recordingcontroller.cpp index 5877278..551ba3a 100644 --- a/recording/recordingcontroller.cpp +++ b/recording/recordingcontroller.cpp @@ -42,6 +42,7 @@ bool RecordingController::end() { _QueueContext contx; contx.arr = _context->finalizer(); contx.format = _context->anotherFormat; + contx.postUploadTask = _context->postUploadTask; queue(contx); }; c->targetFormat = QImage::Format_Alpha8; @@ -94,6 +95,7 @@ void RecordingController::timeout() { if (!uploadQueue.isEmpty()) { auto a = uploadQueue.dequeue(); UploaderSingleton::inst().upload(a.arr, a.format); + if (a.postUploadTask) a.postUploadTask(); } } } diff --git a/recording/recordingcontroller.hpp b/recording/recordingcontroller.hpp index 9e5fa86..25290d9 100644 --- a/recording/recordingcontroller.hpp +++ b/recording/recordingcontroller.hpp @@ -17,12 +17,14 @@ struct RecordingContext { std::function consumer; std::function validator; std::function finalizer; + std::function postUploadTask; QString anotherFormat; }; struct _QueueContext { QByteArray arr; QString format; + std::function postUploadTask; }; class RecordingController : public QObject { diff --git a/recording/recordingformats.cpp b/recording/recordingformats.cpp index d38aeeb..ca515a3 100644 --- a/recording/recordingformats.cpp +++ b/recording/recordingformats.cpp @@ -38,8 +38,6 @@ RecordingFormats::RecordingFormats(formats::Recording f) { return QByteArray(); } QByteArray data = res.readAll(); - tmpDir.removeRecursively(); - QScopedPointer(this); return data; }; validator = [&](QSize s) { @@ -61,7 +59,7 @@ RecordingFormats::RecordingFormats(formats::Recording f) { return true; }; consumer = [&](QImage img) { - if (interrupt) try { + if (!interrupt) try { enc->addFrame(img); } catch (std::runtime_error e) { notifications::notify("KShare Video Encoder Error", e.what(), QSystemTrayIcon::Critical); @@ -69,6 +67,10 @@ RecordingFormats::RecordingFormats(formats::Recording f) { interrupt = true; } }; + postUploadTask = [&] { + tmpDir.removeRecursively(); + QScopedPointer th(this); + }; anotherFormat = formats::recordingFormatName(f); } @@ -80,6 +82,10 @@ std::function RecordingFormats::getFinalizer() { return finalizer; } +std::function RecordingFormats::getPostUploadTask() { + return postUploadTask; +} + std::function RecordingFormats::getValidator() { return validator; } diff --git a/recording/recordingformats.hpp b/recording/recordingformats.hpp index 16e0cb6..433622a 100644 --- a/recording/recordingformats.hpp +++ b/recording/recordingformats.hpp @@ -16,6 +16,7 @@ public: std::function getConsumer(); std::function getValidator(); std::function getFinalizer(); + std::function getPostUploadTask(); QImage::Format getFormat(); QString getAnotherFormat(); @@ -23,6 +24,7 @@ private: std::function consumer; std::function validator; std::function finalizer; + std::function postUploadTask; std::vector frames; QImage::Format iFormat; QDir tmpDir;