USB和图像处理线程若内在申请失败,则直接退出扫描
This commit is contained in:
parent
c040b59488
commit
eb5b86de90
|
@ -710,8 +710,13 @@ void hg_scanner::thread_handle_image_process(void)
|
||||||
fseek(src, 0, SEEK_END);
|
fseek(src, 0, SEEK_END);
|
||||||
length = ftell(src);
|
length = ftell(src);
|
||||||
fseek(src, 0, SEEK_SET);
|
fseek(src, 0, SEEK_SET);
|
||||||
buffer.reset(new std::vector<char>);
|
buffer = aquire_memory((int)length, false);
|
||||||
buffer->resize(length);
|
if (!buffer.get())
|
||||||
|
{
|
||||||
|
|
||||||
|
status_ = SCANNER_ERR_INSUFFICIENT_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
fread(buffer->data(), 1, length, src);
|
fread(buffer->data(), 1, length, src);
|
||||||
fclose(src);
|
fclose(src);
|
||||||
remove(file.c_str());
|
remove(file.c_str());
|
||||||
|
@ -801,6 +806,9 @@ void hg_scanner::working_done(void*)
|
||||||
case SCANNER_ERR_DEVICE_PC_BUSY:
|
case SCANNER_ERR_DEVICE_PC_BUSY:
|
||||||
notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_PC_BUSY, SANE_EVENT_SCAN_FINISHED, status_);
|
notify_ui_working_status(STATU_DESC_SCANNER_ERR_DEVICE_PC_BUSY, SANE_EVENT_SCAN_FINISHED, status_);
|
||||||
break;
|
break;
|
||||||
|
case SCANNER_ERR_INSUFFICIENT_MEMORY:
|
||||||
|
notify_ui_working_status(STATU_DESC_SCANNER_ERR_INSUFFICIENT_MEMORY, SANE_EVENT_SCAN_FINISHED, status_);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
notify_ui_working_status(user_cancel_ ? STATU_DESC_SCAN_CANCELED : STATU_DESC_SCAN_STOPPED, SANE_EVENT_SCAN_FINISHED, status_);
|
notify_ui_working_status(user_cancel_ ? STATU_DESC_SCAN_CANCELED : STATU_DESC_SCAN_STOPPED, SANE_EVENT_SCAN_FINISHED, status_);
|
||||||
break;
|
break;
|
||||||
|
@ -1719,6 +1727,44 @@ int hg_scanner::try_third_app_after_start(int err)
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
std::shared_ptr<std::vector<char>> hg_scanner::aquire_memory(int size, bool from_usb)
|
||||||
|
{
|
||||||
|
std::shared_ptr<std::vector<char>> mem;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
mem.reset(new std::vector<char>(size));
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
mem.reset();
|
||||||
|
HG_VLOG_MINI_1(LOG_LEVEL_FATAL, "Allocate memory of bytes %u failed!\n", size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mem.get())
|
||||||
|
{
|
||||||
|
if (from_usb && final_imgs_.Size())
|
||||||
|
{
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||||
|
try
|
||||||
|
{
|
||||||
|
mem.reset(new std::vector<char>(size));
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
mem.reset();
|
||||||
|
HG_VLOG_MINI_1(LOG_LEVEL_FATAL, "Allocate memory of bytes %u failed secondary after 10 milliseconds!\n", size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!mem.get())
|
||||||
|
{
|
||||||
|
HG_LOG(LOG_LEVEL_FATAL, "Can't aquire enough memory, working must be stopped!\n");
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
int hg_scanner::notify_ui_working_status(const char* msg, int ev, int status)
|
int hg_scanner::notify_ui_working_status(const char* msg, int ev, int status)
|
||||||
{
|
{
|
||||||
unsigned int s = status;
|
unsigned int s = status;
|
||||||
|
|
|
@ -261,6 +261,7 @@ protected:
|
||||||
int on_scann_error(int err); // 返回“0”忽略错误继续执行,其它值则停止后续工作
|
int on_scann_error(int err); // 返回“0”忽略错误继续执行,其它值则停止后续工作
|
||||||
int try_third_app_handle_start(bool& handled);
|
int try_third_app_handle_start(bool& handled);
|
||||||
int try_third_app_after_start(int err);
|
int try_third_app_after_start(int err);
|
||||||
|
std::shared_ptr<std::vector<char>> aquire_memory(int size, bool from_usb = true);
|
||||||
|
|
||||||
// callback to ui ...
|
// callback to ui ...
|
||||||
int notify_ui_working_status(const char* msg, int ev = SANE_EVENT_STATUS, int status = SCANNER_ERR_OK);
|
int notify_ui_working_status(const char* msg, int ev = SANE_EVENT_STATUS, int status = SCANNER_ERR_OK);
|
||||||
|
|
|
@ -350,6 +350,12 @@ void hg_scanner_200::thread_handle_usb_read(void)
|
||||||
else if (usb.u32_Data == HAVE_IMAGE)
|
else if (usb.u32_Data == HAVE_IMAGE)
|
||||||
{
|
{
|
||||||
ret = get_img_data(usb.u32_Count);
|
ret = get_img_data(usb.u32_Count);
|
||||||
|
if (ret == SCANNER_ERR_INSUFFICIENT_MEMORY)
|
||||||
|
{
|
||||||
|
status_ = ret;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
io_->set_timeout(200);
|
io_->set_timeout(200);
|
||||||
pop_image();
|
pop_image();
|
||||||
sw.reset();
|
sw.reset();
|
||||||
|
@ -371,7 +377,11 @@ void hg_scanner_200::thread_handle_usb_read(void)
|
||||||
get_scanner_status(usb);
|
get_scanner_status(usb);
|
||||||
if (usb.u32_Data == HAVE_IMAGE)
|
if (usb.u32_Data == HAVE_IMAGE)
|
||||||
{
|
{
|
||||||
get_img_data(usb.u32_Count);
|
if(get_img_data(usb.u32_Count) == SCANNER_ERR_INSUFFICIENT_MEMORY)
|
||||||
|
{
|
||||||
|
status_ = SCANNER_ERR_INSUFFICIENT_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
io_->set_timeout(200);
|
io_->set_timeout(200);
|
||||||
pop_image();
|
pop_image();
|
||||||
sw.reset();
|
sw.reset();
|
||||||
|
@ -540,8 +550,11 @@ int hg_scanner_200::get_img_data(unsigned int bytes)
|
||||||
ret = SCANNER_ERR_OK,
|
ret = SCANNER_ERR_OK,
|
||||||
index = 0,
|
index = 0,
|
||||||
block = total;
|
block = total;
|
||||||
std::shared_ptr<std::vector<char >> imagedata(new std::vector<char>(total));
|
std::shared_ptr<std::vector<char >> imagedata(aquire_memory(total));
|
||||||
|
|
||||||
|
if (!imagedata.get())
|
||||||
|
return SCANNER_ERR_INSUFFICIENT_MEMORY;
|
||||||
|
|
||||||
USBCB usb{GET_IMAGE, 0, total};
|
USBCB usb{GET_IMAGE, 0, total};
|
||||||
ret = writeusb(usb);
|
ret = writeusb(usb);
|
||||||
if (ret != SCANNER_ERR_OK)
|
if (ret != SCANNER_ERR_OK)
|
||||||
|
|
|
@ -1000,8 +1000,10 @@ int hg_scanner_239::read_one_image_from_usb(void)
|
||||||
ret = status_;
|
ret = status_;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::shared_ptr<std::vector<char>> buf(new std::vector<char>);
|
std::shared_ptr<std::vector<char>> buf(aquire_memory(total));
|
||||||
buf->resize(total);
|
if (!buf.get())
|
||||||
|
return SCANNER_ERR_INSUFFICIENT_MEMORY;
|
||||||
|
|
||||||
// write reading command
|
// write reading command
|
||||||
ret = write_register(SR_IM_TX, 1);
|
ret = write_register(SR_IM_TX, 1);
|
||||||
|
|
||||||
|
|
|
@ -322,7 +322,13 @@ void hg_scanner_300::thread_handle_usb_read(void)
|
||||||
if (ret == SCANNER_ERR_OK && usb.u32_Count > 0)
|
if (ret == SCANNER_ERR_OK && usb.u32_Count > 0)
|
||||||
{
|
{
|
||||||
int totalNum = usb.u32_Count;
|
int totalNum = usb.u32_Count;
|
||||||
std::shared_ptr<std::vector<char >> imagedata(new std::vector<char> (totalNum));
|
std::shared_ptr<std::vector<char >> imagedata(aquire_memory(totalNum));
|
||||||
|
|
||||||
|
if (!imagedata.get())
|
||||||
|
{
|
||||||
|
status_ = SCANNER_ERR_INSUFFICIENT_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ret = get_img_data(imagedata);
|
ret = get_img_data(imagedata);
|
||||||
io_->set_timeout(200);
|
io_->set_timeout(200);
|
||||||
|
|
|
@ -319,7 +319,13 @@ void hg_scanner_400::thread_handle_usb_read(void)
|
||||||
if (ret == SCANNER_ERR_OK && usb.u32_Count > 0)
|
if (ret == SCANNER_ERR_OK && usb.u32_Count > 0)
|
||||||
{
|
{
|
||||||
int totalNum = usb.u32_Count;
|
int totalNum = usb.u32_Count;
|
||||||
std::shared_ptr<std::vector<char >> imagedata(new std::vector<char> (totalNum));
|
std::shared_ptr<std::vector<char >> imagedata(aquire_memory(totalNum));
|
||||||
|
|
||||||
|
if (!imagedata.get())
|
||||||
|
{
|
||||||
|
status_ = SCANNER_ERR_INSUFFICIENT_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ret = get_img_data(imagedata);
|
ret = get_img_data(imagedata);
|
||||||
io_->set_timeout(200);
|
io_->set_timeout(200);
|
||||||
|
|
Loading…
Reference in New Issue