From e00213c5972fc28c52d12c9ed78f0eaf08ad733d Mon Sep 17 00:00:00 2001 From: Christophe Meneboeuf Date: Wed, 17 Feb 2021 00:09:22 +0100 Subject: [PATCH] * Image processed in a separated thred from presentation * 5 attempts. If all five fail, the program ends. --- Rgb2Hires_PC/src/Display.cpp | 79 +++++++++++++++++++++++++---------- Rgb2Hires_PC/src/Display.h | 2 + Rgb2Hires_PC/test.png | Bin 4754 -> 4246 bytes 3 files changed, 58 insertions(+), 23 deletions(-) diff --git a/Rgb2Hires_PC/src/Display.cpp b/Rgb2Hires_PC/src/Display.cpp index 2a46e73..b78f0b4 100644 --- a/Rgb2Hires_PC/src/Display.cpp +++ b/Rgb2Hires_PC/src/Display.cpp @@ -94,27 +94,61 @@ namespace RgbToHires void Window::display(const std::string& path, const uint8_t* hiresblob) { - { - auto pViewport = ComputeRgbBuffer(hiresblob); - SDL_UpdateTexture(_pTexture, nullptr, pViewport->data(), sizeof(rgba8Bits_t) * 560); - SDL_RenderClear(_pRenderer); - SDL_RenderCopy(_pRenderer, _pTexture, NULL, NULL); - SDL_RenderPresent(_pRenderer); - } + + struct { + bool happened = false; + std::string what; + } error; + + auto pViewport = ComputeRgbBuffer(hiresblob); + SDL_UpdateTexture(_pTexture, nullptr, pViewport->data(), sizeof(rgba8Bits_t) * 560); + SDL_RenderClear(_pRenderer); + SDL_RenderCopy(_pRenderer, _pTexture, NULL, NULL); + SDL_RenderPresent(_pRenderer); // launch thread to survey file modifications - _pThread = new std::thread([this, path] { // freed in ~Window() + _pThread = new std::thread( [this, &path, &pViewport, &error] // freed in ~Window() + { auto timeModified = std::filesystem::last_write_time(path); while (!this->_stopFileSurvey.load()) { - std::this_thread::sleep_for(std::chrono::milliseconds(200)); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); const bool isImgModified(timeModified != std::filesystem::last_write_time(path)); - if (isImgModified) { - timeModified = std::filesystem::last_write_time(path); - this->_isFileModified.store(isImgModified); + if (isImgModified) + { + bool isDone = false; + int nbErrors = 0; + while (!isDone) // several attempts as the file may be marked modified before being written + { + try + { + this_thread::sleep_for(std::chrono::milliseconds(500)); // 500ms between each attempt + // update hires image + const auto imageRgb = Magick::Image{ path }; + auto imageQuantized = ImageQuantized{ imageRgb }; + const auto imageHiRes = Picture{ imageQuantized }; + + // rgb conversion from hires data + std::lock_guard lock{ this->_mutex }; // protecting pViewport + pViewport = ComputeRgbBuffer(imageHiRes.getBlob()->data()); + isDone = true; + timeModified = std::filesystem::last_write_time(path); + this->_isFileModified.store(isImgModified); + } + catch (Magick::Error& e) + { + ++nbErrors; + if (nbErrors >= 5) { // 5 atttemps + isDone = true; + error.happened = true; + error.what = e.what(); + this->_stopFileSurvey.store(true); + } + } + } } } - }); + }); // thread _pThread->detach(); // event loop @@ -123,25 +157,24 @@ namespace RgbToHires { if (_isFileModified.load()) { - // update hires image - const auto imageRgb = Magick::Image{ path }; - auto imageQuantized = ImageQuantized{ imageRgb }; - const auto imageHiRes = Picture{ imageQuantized }; - - // rgb conversion from hires data - auto pViewport = ComputeRgbBuffer(imageHiRes.getBlob()->data()); - // update the display with rgb data - SDL_UpdateTexture(_pTexture, nullptr, pViewport->data(), sizeof(rgba8Bits_t) * 560); + { + std::lock_guard lock{ this->_mutex }; // protecting pViewport + SDL_UpdateTexture(_pTexture, nullptr, pViewport->data(), sizeof(rgba8Bits_t) * 560); + } SDL_RenderClear(_pRenderer); SDL_RenderCopy(_pRenderer, _pTexture, NULL, NULL); SDL_RenderPresent(_pRenderer); } - if (SDL_WaitEventTimeout(&e, 250)) + if (SDL_WaitEventTimeout(&e, 100)) { if (e.type == SDL_QUIT) { break; } } + + if (error.happened) { + throw std::runtime_error{ error.what }; + } } } diff --git a/Rgb2Hires_PC/src/Display.h b/Rgb2Hires_PC/src/Display.h index 3042445..58f6e2f 100644 --- a/Rgb2Hires_PC/src/Display.h +++ b/Rgb2Hires_PC/src/Display.h @@ -20,6 +20,7 @@ #include #include +#include #include "ImageQuantized.h" #include "HiRes.h" @@ -60,6 +61,7 @@ namespace RgbToHires void sdlError(const std::string& msg); std::thread* _pThread = nullptr; //< to survey filechange + std::mutex _mutex; std::atomic_bool _isFileModified = false; std::atomic_bool _stopFileSurvey = false; diff --git a/Rgb2Hires_PC/test.png b/Rgb2Hires_PC/test.png index 47f61ec41cccde95a6b415f8099c345b0b155b91..20c0feed398ccba9fcda84a47af8e4f32a8a3b87 100644 GIT binary patch delta 2659 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 delta 3171 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