图片堆积过大时等待最多1分钟([mem]wait 可配置等待时长,单位为秒),内存控制为400MB

This commit is contained in:
gb 2023-09-12 15:47:00 +08:00
parent ee59304466
commit e44b31b0c1
2 changed files with 24 additions and 18 deletions

View File

@ -85,12 +85,12 @@ namespace callback
std::vector<SCNINST> g_scanner_instances;
int sane_event_callback( // 濞夈劌鍞介崶鐐剁殶閻ㄥ嫬顕挒鈽呯礉闂団偓鐟曚椒绻氱拠浣筋嚉閸ョ偠鐨熼弰顖氼樋缁捐法鈻肩€瑰鍙忛惃?
SANE_Handle hdev // 娴溠呮晸娴滃娆㈤惃鍕啎婢跺洤褰為弻?
, int code // 閸ョ偠鐨熸禍瀣╂娴狅絿鐖?
SANE_Handle hdev // 娴溠å®æ™¸å¨´æ»ƒîƒ„娆㈤惃é<EFBFBD>•î‡…啎婢跺洤褰çºå¼?
, int code // é¸ãƒ§å<EFBFBD> é<EFBFBD>¨ç†¸ç¦<EFBFBD>瀣â•î½å¨´ç…絿é<EFBFBD>?
, void* data // 閸ョ偠鐨熸禍瀣╂閺佺増宓侀敍灞剧壌閹诡喕绨ㄦ禒鏈靛敩閻焦婀侀幍鈧稉宥呮倱閿涘苯寮悡褍鍙挎担鎾茬皑娴犺泛鐣炬稊?
, unsigned int* len // 閺佺増宓侀梹鍨閿涘牆鐡ч懞鍌︾礆閿涘本鍨ㄩ懓鍗恦ent_data閻ㄥ嫮绱﹂崘鎻掑隘闂€鍨閿涘矁顕涚紒鍡氼嚞閻娴夋惔鏃傛畱娴滃娆㈡禒锝囩垳
, unsigned int* len // éºä½ºå¢—宓侀梹é<EFBFBD>¨î†¼î†Šé¿æ¶˜ç‰†é<EFBFBD>¡Ñ‡æ‡žé<EFBFBD>Œï¸¾ç¤†é¿æ¶˜æœ¬é<EFBFBD>¨ã„©æ‡“é<EFBFBD>—æ<EFBFBD>¦ent_dataé»ã„¥å«®ç»±ï¹å´˜éŽ»æŽéš˜é—â¬é<EFBFBD>¨î†¼î†Šé¿æ¶˜çŸ<EFBFBD>顕涚ç´é<EFBFBD>¡æ°¼åšžé»î<EFBFBD>„娴å¤æƒ”é<EFBFBD>ƒå畱娴滃娆㈡ç¦é”<EFBFBD>å©åž?
, void* param // 閻劍鍩涢懛顏勭暰娑斿鏆熼幑顕嗙礉娑撳氦鐨熼悽鈺痑ne_init_ex娴肩姴鍙嗛弮鍓佹畱娣囨繃瀵旀稉鈧懛?
) // 鏉╂柨娲栭崐闂寸贩娑撳秴鎮撻惃鍕皑娴犳湹鍞惍浣解偓灞界暰閿涘矂鈧艾鐖舵稉琛♀偓?閳?
) // é<EFBFBD>‰â•æŸ¨å¨²æ ­å´<EFBFBD>é—寸贩å¨æ³ç§´éŽ®æ»æƒƒé<EFBFBD>•î<EFBFBD>†çšå¨´çŠ³æ¹¹é<EFBFBD>žî„„æƒ<EFBFBD>浣解å<EFBFBD>“ç<EFBFBD>žç•Œæš°é¿æ¶˜çŸéˆ§î„<EFBFBD>艾é<EFBFBD>舵稉ç<EFBFBD>♀å<EFBFBD>?é–?
{
std::lock_guard<std::mutex> lock(cb_lock_);
std::vector<SCNINST>::iterator it = std::find(g_scanner_instances.begin(), g_scanner_instances.end(), hdev);
@ -207,10 +207,10 @@ namespace callback
, {SANE_STD_OPT_NAME_COLOR_CORRECTION , OPTION_TITLE_SPJZ}
, {SANE_STD_OPT_NAME_DISCARDBLANK , OPTION_TITLE_TGKBY}
},
g_discard[] = { {SANE_STD_OPT_NAME_REVERSE_01 , "\351\273\221\347\231\275\345\233\276\345\203\217\345\217\215\350\211\262\350\276\223\345\207\272\357\274\210\346\255\243\345\270\270\351\242\234\350\211\262\344\270\272\357\274\2320-\351\273\221\350\211\262\357\274\2331-\347\231\275\350\211\262\357\274\211"} // 姒涙垹娅ч崶鎯у剼閸欏秷澹婃潏鎾冲毉閿涘牊顒滅敮鎼侇杹閼硅弓璐熼敍?-姒涙垼澹婇敍?-閻у€熷閿?
, {SANE_STD_OPT_NAME_FILTER , "\347\201\260\345\272\246\346\210\226\351\273\221\347\231\275\345\233\276\345\203\217 - \351\231\244\350\211\262"} // 閻忔澘瀹抽幋鏍拨閻ц棄娴橀崓?- 闂勩倛澹?
, {SANE_STD_OPT_NAME_IS_AUTO_FEED_STRENGTH , "\350\207\252\345\212\250\346\220\223\347\272\270\345\274\272\345\272\246"} // 閼奉亜濮╅幖鎾剁剨瀵搫瀹?
, {SANE_STD_OPT_NAME_FEED_STRENGTH_VALUE , "\346\220\223\347\272\270\351\230\210\345\200\274"} // " 閹兼挾鐒婇梼鍫濃偓?
g_discard[] = { {SANE_STD_OPT_NAME_REVERSE_01 , "\351\273\221\347\231\275\345\233\276\345\203\217\345\217\215\350\211\262\350\276\223\345\207\272\357\274\210\346\255\243\345\270\270\351\242\234\350\211\262\344\270\272\357\274\2320-\351\273\221\350\211\262\357\274\2331-\347\231\275\350\211\262\357\274\211"} // å§æ¶™åž¹å¨…ч崶鎯у剼é¸æ¬<EFBFBD>秷澹婃æ½<EFBFBD>鎾冲毉é¿æ¶˜ç‰Šé¡æ»…敮鎼侇æ<EFBFBD>¹é¼ç¡…弓ç<EFBFBD>熼æ•?-å§æ¶™åž¼æ¾¹å©‡æ•<C3A6>?-é»Ñƒâ¬ç†·î—<C3AE>é?
, {SANE_STD_OPT_NAME_FILTER , "\347\201\260\345\272\246\346\210\226\351\273\221\347\231\275\345\233\276\345\203\217 - \351\231\244\350\211\262"} // é»å¿”澘瀹抽å¹é<EFBFBD><EFBFBD>î… æ¨é»Ñ†æ£„娴橀å´?- 闂勩倛澹?
, {SANE_STD_OPT_NAME_IS_AUTO_FEED_STRENGTH , "\350\207\252\345\212\250\346\220\223\347\272\270\345\274\272\345\272\246"} // é¼å¥‰äºœæ¿®â•…å¹éŽ¾å‰<EFBFBD>剨瀵æ<EFBFBD>«ç€?
, {SANE_STD_OPT_NAME_FEED_STRENGTH_VALUE , "\346\220\223\347\272\270\351\230\210\345\200\274"} // " é¹å…¼æŒ¾é<EFBFBD>婇梼é<EFBFBD>«æ¿ƒå<EFBFBD>?
};
const char* option_title_2_name(const char* title)
{
@ -352,7 +352,7 @@ namespace callback
int (*show_progress_ui)(HWND parent, std::function<void(ui_result)> callback, std::function<void(int/*event*/, void*/*msg*/, int/*flag*/)>* notify) = NULL;
int (*show_messagebox_ui)(HWND parent, int event, void* msg, int flag) = NULL;
int (*close_ui)(int) = NULL;
int (*apply_given_config)(const char* content, SANE_Handle device, LPSANEAPI api) = NULL; // 鎼存梻鏁ら幐鍥х暰閻ㄥ嫰鍘ょ純顕嗙礉content娑撴椽鍘ょ純顔芥殶閹诡喗绁?
int (*apply_given_config)(const char* content, SANE_Handle device, LPSANEAPI api) = NULL; // 鎼存梻é<EFBFBD><EFBFBD>ã‰å¹<EFBFBD>é<EFBFBD>¥Ñ…æš°é»ã„¥å«°é<EFBFBD>˜ã‡ç´”顕嗙礉contentå¨æ´æ¤½é<EFBFBD>˜ã‡ç´”顔芥殶é¹è¯¡å—ç»?
char* (*get_config_content)(const char* dev_name, const char* name) = NULL;
void (*twain_ui_free)(void* buf) = NULL;
@ -483,7 +483,7 @@ scanner::scanner(SCANNERID id) : handle_(NULL), id_(id), ex_id_(EXTENSION_ID_BAS
, dpi_(200), tmp_path_(L""), img_ind_(0)
, scanner_name_(L""), cfg_(NULL), is_ui_wait_img_(false), is_scanning_(false)
, scanner_ev_handler_(NULL), evh_param_(NULL), app_wnd_(NULL), user_cancel_(false)
, max_img_mem_(1 * 1024), twain_set_(false), ev_cnt_(0), is_bIndicator(false), is_show_setting_(false)
, max_img_mem_(400), wait_fetch_(60 * 1000), twain_set_(false), ev_cnt_(0), is_bIndicator(false), is_show_setting_(false)
{
ui_notify = std::function<void(int, void*, int)>();
@ -533,6 +533,11 @@ scanner::scanner(SCANNERID id) : handle_(NULL), id_(id), ex_id_(EXTENSION_ID_BAS
// this value is same as driver memory limit ...
max_img_mem_ = mem_limit;
}
mem_limit = GetPrivateProfileIntW(L"mem", L"wait", 0, (cfg_path_ + L"debug.cfg").c_str());
if (mem_limit > 0)
{
wait_fetch_ = mem_limit * 1000; // second to millisecond
}
err_ = open();
}
scanner::~scanner()
@ -1203,7 +1208,7 @@ int scanner::init_options_id(void)
if (is_erase_hole_id_ == -1)
{
// 閸忕厧顔愰懓浣烘畱闂勩倕鐡熺粻妤佺《
// é¸å¿•åŽ§é¡”愰懓浣烘畱é—å©å€•é<EFBFBD>¡ç†ºç²»å¦¤ä½ºã€?
EXAPI ea;
ea.ind = is_erase_hole_id_ = ex_id_++;
@ -3487,15 +3492,15 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len)
if (img->bytes() /*>= simg->bytes*/)
{
size_t bytes = 0;
int times = 0;
images_.count(&bytes);
int times = 0, cnt0 = images_.count(&bytes), cnt = cnt0,
gap = 5, max_wait = wait_fetch_ / gap;
img->set_image_status((SANE_Image_Statu)simg->flag.statu);
bytes /= 1024 * 1024;
while (bytes > max_img_mem_ && !user_cancel_ && times++ < 20) // memory control
while (bytes > max_img_mem_ && !user_cancel_ && times++ < max_wait && cnt >= cnt0) // memory control
{
std::this_thread::sleep_for(std::chrono::milliseconds(5));
images_.count(&bytes);
std::this_thread::sleep_for(std::chrono::milliseconds(gap));
cnt = images_.count(&bytes);
bytes /= 1024 * 1024;
if (times == 1)
log_info(L"Memory usage upto limit! wait up to 100 ms ...\r\n", 1);
@ -3563,7 +3568,7 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len)
// {
// callback::show_messagebox_ui(app_wnd_, ev_code, (void*)data, 0);
// }
// else if (*len) //闁挎瑨顕ゅ鐟板毉
// else if (*len) //é—<EFBFBD>挎ç¨é¡•ã…é<EFBFBD>Ÿæ<EFBFBD>¿æ¯?
// {
// std::wstring msg(local_trans::a2u((char*)data, CP_UTF8));
// if (!IsWindow(app_wnd_))

View File

@ -61,6 +61,7 @@ class scanner : public ISaneInvoker, virtual public refer
twain_xfer xfer_;
safe_img_queue images_;
size_t max_img_mem_;
size_t wait_fetch_; // ms, wait time when image-queue is great than max_img_mem_, default 1min
safe_queue<int> events_; //如果有界面,则全部保存从界面传回的消息;否则只保存开始扫描和结束扫描的事件
int ev_cnt_;
SANE_FinalImgFormat img_fmt_;