“sane等待所有图片流程结束再调用sane_cancel,解决丢弃图像后继续扫描的流程异常问题”

This commit is contained in:
yangjiaxuan 2023-10-18 18:39:03 +08:00
parent 708f263aff
commit fe2d00802f
4 changed files with 29 additions and 18 deletions

View File

@ -216,7 +216,8 @@ DeviceUser::DeviceUser(QWidget *wnd, HGSaneSource source, const QString &passwor
m_source = source; m_source = source;
m_saneDev = nullptr; m_saneDev = nullptr;
m_password = password; m_password = password;
m_reserveImage = false; m_abnormlImageStatus = HGSANE_IMAGE_STATUS_NO_STATUS;
m_abnormalImageResult = HGBASE_ERR_OK;
} }
DeviceUser::~DeviceUser() DeviceUser::~DeviceUser()
@ -367,31 +368,37 @@ void HGAPI DeviceUser::DeviceEventFunc(HGSaneDevice dev, HGUInt event, HGPointer
if (HGSANE_EVENT_TYPE_SCANFINISHED == event) if (HGSANE_EVENT_TYPE_SCANFINISHED == event)
{ {
emit p->scanFinishEvent(); emit p->scanFinishEvent();
p->m_reserveImage = false; p->m_abnormlImageStatus = HGSANE_IMAGE_STATUS_NO_STATUS;
p->m_abnormalImageResult = HGBASE_ERR_OK;
} }
else if (HGSANE_EVENT_TYPE_WORKING == event) else if (HGSANE_EVENT_TYPE_WORKING == event)
{ {
emit p->scanWorkingEvent(); emit p->scanWorkingEvent();
p->m_abnormlImageStatus = HGSANE_IMAGE_STATUS_NO_STATUS;
p->m_abnormalImageResult = HGBASE_ERR_OK;
} }
} }
HGUInt HGAPI DeviceUser::DeviceImageFunc(HGSaneDevice dev, HGImage image, HGUInt type, HGPointer param) HGUInt HGAPI DeviceUser::DeviceImageFunc(HGSaneDevice dev, HGImage image, HGUInt type, HGPointer param)
{ {
DeviceUser* p = (DeviceUser*)param; DeviceUser* p = (DeviceUser*)param;
HGUInt result = HGBASE_ERR_OK;
if (HGSANE_IMAGE_TYPE_DOUBLE == type && !p->m_reserveImage) if (HGSANE_IMAGE_TYPE_DOUBLE == type && HGSANE_IMAGE_STATUS_NO_STATUS == p->m_abnormlImageStatus)
{ {
emit p->abnormalImage(image, &result); emit p->abnormalImage(image, &p->m_abnormalImageResult);
} }
if (HGBASE_ERR_OK == result) if (HGBASE_ERR_OK == p->m_abnormalImageResult || HGSANE_IMAGE_STATUS_RESERVE == p->m_abnormlImageStatus)
{ {
p->m_reserveImage = true; if (HGSANE_IMAGE_TYPE_DOUBLE == type)
p->m_abnormlImageStatus = HGSANE_IMAGE_STATUS_RESERVE;
emit p->newImage(image); emit p->newImage(image);
} }
else else
{ {
return HGSANE_ERR_STOPSCAN; p->m_abnormlImageStatus = HGSANE_IMAGE_STATUS_DISCARD;
return HGBASE_ERR_FAIL;
} }
return HGBASE_ERR_OK; return HGBASE_ERR_OK;

View File

@ -134,7 +134,8 @@ private:
HGSaneDevice m_saneDev; HGSaneDevice m_saneDev;
QString m_password; QString m_password;
bool m_reserveImage; HGUInt m_abnormlImageStatus;
HGUInt m_abnormalImageResult;
}; };
#endif #endif

View File

@ -42,6 +42,10 @@ typedef struct
#define HGSANE_IMAGE_TYPE_NORMAL 0L #define HGSANE_IMAGE_TYPE_NORMAL 0L
#define HGSANE_IMAGE_TYPE_DOUBLE 1L #define HGSANE_IMAGE_TYPE_DOUBLE 1L
#define HGSANE_IMAGE_STATUS_NO_STATUS 0L
#define HGSANE_IMAGE_STATUS_RESERVE 1L
#define HGSANE_IMAGE_STATUS_DISCARD 2L
/* Sane回调 /* Sane回调
*/ */
typedef void (HGAPI* HGSane_DeviceEventFunc)(HGSaneDevice dev, HGUInt event, HGPointer param); typedef void (HGAPI* HGSane_DeviceEventFunc)(HGSaneDevice dev, HGUInt event, HGPointer param);

View File

@ -1121,8 +1121,7 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
HGUInt type = (SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat1) HGUInt type = (SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat1)
? HGSANE_IMAGE_TYPE_DOUBLE : HGSANE_IMAGE_TYPE_NORMAL; ? HGSANE_IMAGE_TYPE_DOUBLE : HGSANE_IMAGE_TYPE_NORMAL;
HGUInt imgRet = p->m_imageFunc((HGSaneDevice)p, img, type, p->m_imageParam); HGUInt imgRet = p->m_imageFunc((HGSaneDevice)p, img, type, p->m_imageParam);
if (HGSANE_ERR_STOPSCAN == imgRet)
stopScan = true;
HGBase_DestroyImage(img); HGBase_DestroyImage(img);
} }
} }
@ -1131,13 +1130,13 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
buffer = NULL; buffer = NULL;
bufferSize = 0; bufferSize = 0;
if (stopScan) // if (stopScan)
{ // {
saneAPI.sane_cancel_api(p->m_devHandle); // saneAPI.sane_cancel_api(p->m_devHandle);
if (NULL != p->m_scanNotify) // if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0); // p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0);
break; // break;
} // }
if (!p->m_cancelScan) if (!p->m_cancelScan)
{ {