diff --git a/src/pdf/XPDFRenderer.cpp b/src/pdf/XPDFRenderer.cpp index 301406c5..045156e8 100644 --- a/src/pdf/XPDFRenderer.cpp +++ b/src/pdf/XPDFRenderer.cpp @@ -106,7 +106,13 @@ XPDFRenderer::~XPDFRenderer() { disconnect(&m_cacheThread, SIGNAL(finished()), this, SLOT(OnThreadFinished())); m_cacheThread.cancelPending(); - m_cacheThread.wait(); // Would crash if data deleted during processing. + m_cacheThread.wait(XPDFThreadMaxTimeoutOnExit::timeout_ms); + if (m_cacheThread.isRunning()) + { + // Kill the thread, which might still run for minutes if the user choose a heavy pdf highly zoomed. + // Since there is no data written, but only processing, this is safe on a modern OS. + m_cacheThread.terminate(); + } for(int i = 0; i < m_pdfZoomCache.size(); i++) { diff --git a/src/pdf/XPDFRenderer.h b/src/pdf/XPDFRenderer.h index bd31982b..c62839a5 100644 --- a/src/pdf/XPDFRenderer.h +++ b/src/pdf/XPDFRenderer.h @@ -67,6 +67,11 @@ namespace XPDFRendererZoomFactor const double mode4_zoomFactorIterations = 7; } +namespace XPDFThreadMaxTimeoutOnExit +{ + const double timeout_ms = 3000; +} + class XPDFRenderer : public PDFRenderer { Q_OBJECT