From a3abedfaa322615a23e6a86ba62979ed6fc52f36 Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Sat, 12 Aug 2023 18:43:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=82=B9=E5=87=BB=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E6=89=AB=E6=8F=8F=E5=90=8E=E5=8F=96=E6=B3=95=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/sane_user/HGSaneImpl.cpp | 37 ++++++++++++++++++++++---------- modules/sane_user/HGSaneImpl.hpp | 1 + 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/modules/sane_user/HGSaneImpl.cpp b/modules/sane_user/HGSaneImpl.cpp index 13e5191e..f2aee4c2 100644 --- a/modules/sane_user/HGSaneImpl.cpp +++ b/modules/sane_user/HGSaneImpl.cpp @@ -644,6 +644,7 @@ HGSaneDeviceImpl::HGSaneDeviceImpl(HGSaneSourceImpl* sourceImpl) m_imageParam = NULL; m_stopThread = HGFALSE; m_thread = NULL; + m_cancelScan = false; } HGSaneDeviceImpl::~HGSaneDeviceImpl() @@ -871,6 +872,7 @@ HGResult HGSaneDeviceImpl::Start(HGWindow parent, HGSane_DeviceEventFunc eventFu GetScanCount(&m_oldScanCount); m_stopThread = HGFALSE; + m_cancelScan = false; HGBase_OpenThread(ThreadFunc, this, &m_thread); return HGBASE_ERR_OK; } @@ -912,6 +914,7 @@ HGResult HGSaneDeviceImpl::StartWithSingleScan(HGWindow parent, HGSane_DeviceEve SetScanCount(1); m_stopThread = HGFALSE; + m_cancelScan = false; HGBase_OpenThread(ThreadFunc, this, &m_thread); return HGBASE_ERR_OK; } @@ -941,6 +944,7 @@ void HGSaneDeviceImpl::UIResultCallback(ui_result result) { if (NULL != m_curDevice->m_thread) { + m_curDevice->m_cancelScan = true; m_curDevice->m_sourceImpl->m_saneApi.sane_cancel_api(m_curDevice->m_devHandle); } } @@ -1010,6 +1014,14 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) } else if (SANE_STATUS_EOF == stat2) { + if (0 == readSize && p->m_cancelScan) + { + free(buffer); + if (NULL != p->m_scanNotify) + p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(SANE_STATUS_CANCELLED), (int)SANE_STATUS_CANCELLED); + break; + } + if (0 == readSize || readSize != params.bytes_per_line * params.lines) { free(buffer); @@ -1060,18 +1072,21 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) buffer = NULL; bufferSize = 0; - SANE_Status stat3 = saneAPI.sane_start_api(p->m_devHandle); - if (SANE_STATUS_NO_DOCS == stat3) + if (!p->m_cancelScan) { - if (NULL != p->m_scanNotify) - p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0); - break; - } - else if (SANE_STATUS_GOOD != stat3) - { - if (NULL != p->m_scanNotify) - p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat3), (int)stat3); - break; + SANE_Status stat3 = saneAPI.sane_start_api(p->m_devHandle); + if (SANE_STATUS_NO_DOCS == stat3) + { + if (NULL != p->m_scanNotify) + p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0); + break; + } + else if (SANE_STATUS_GOOD != stat3) + { + if (NULL != p->m_scanNotify) + p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, (void*)saneAPI.sane_strstatus_api(stat3), (int)stat3); + break; + } } } } diff --git a/modules/sane_user/HGSaneImpl.hpp b/modules/sane_user/HGSaneImpl.hpp index 98d9ddbb..2902c5d8 100644 --- a/modules/sane_user/HGSaneImpl.hpp +++ b/modules/sane_user/HGSaneImpl.hpp @@ -120,6 +120,7 @@ private: HGInt m_oldScanCount; volatile HGBool m_stopThread; HGThread m_thread; + volatile bool m_cancelScan; }; #endif /* __HGSANEIMPL_HPP__ */