“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_saneDev = nullptr;
m_password = password;
m_reserveImage = false;
m_abnormlImageStatus = HGSANE_IMAGE_STATUS_NO_STATUS;
m_abnormalImageResult = HGBASE_ERR_OK;
}
DeviceUser::~DeviceUser()
@ -367,31 +368,37 @@ void HGAPI DeviceUser::DeviceEventFunc(HGSaneDevice dev, HGUInt event, HGPointer
if (HGSANE_EVENT_TYPE_SCANFINISHED == event)
{
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)
{
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)
{
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);
}
else
{
return HGSANE_ERR_STOPSCAN;
p->m_abnormlImageStatus = HGSANE_IMAGE_STATUS_DISCARD;
return HGBASE_ERR_FAIL;
}
return HGBASE_ERR_OK;

View File

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

View File

@ -42,6 +42,10 @@ typedef struct
#define HGSANE_IMAGE_TYPE_NORMAL 0L
#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回调
*/
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)
? HGSANE_IMAGE_TYPE_DOUBLE : HGSANE_IMAGE_TYPE_NORMAL;
HGUInt imgRet = p->m_imageFunc((HGSaneDevice)p, img, type, p->m_imageParam);
if (HGSANE_ERR_STOPSCAN == imgRet)
stopScan = true;
HGBase_DestroyImage(img);
}
}
@ -1131,13 +1130,13 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
buffer = NULL;
bufferSize = 0;
if (stopScan)
{
saneAPI.sane_cancel_api(p->m_devHandle);
if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0);
break;
}
// if (stopScan)
// {
// saneAPI.sane_cancel_api(p->m_devHandle);
// if (NULL != p->m_scanNotify)
// p->m_scanNotify((int)SANE_EVENT_SCAN_FINISHED, NULL, 0);
// break;
// }
if (!p->m_cancelScan)
{