图片堆积过大时等待最多1分钟([mem]wait 可配置等待时长,单位为秒),内存控制为400MB
This commit is contained in:
parent
ee59304466
commit
e44b31b0c1
|
@ -85,12 +85,12 @@ namespace callback
|
||||||
std::vector<SCNINST> g_scanner_instances;
|
std::vector<SCNINST> g_scanner_instances;
|
||||||
|
|
||||||
int sane_event_callback( // 濞夈劌鍞介崶鐐剁殶閻ㄥ嫬顕挒鈽呯礉闂団偓鐟曚椒绻氱拠浣筋嚉閸ョ偠鐨熼弰顖氼樋缁捐法鈻肩€瑰鍙忛惃?
|
int sane_event_callback( // 濞夈劌鍞介崶鐐剁殶閻ㄥ嫬顕挒鈽呯礉闂団偓鐟曚椒绻氱拠浣筋嚉閸ョ偠鐨熼弰顖氼樋缁捐法鈻肩€瑰鍙忛惃?
|
||||||
SANE_Handle hdev // 娴溠呮晸娴滃娆㈤惃鍕啎婢跺洤褰為弻?
|
SANE_Handle hdev // å¨´æº å‘®æ™¸å¨´æ»ƒîƒ„å¨†ãˆ¤æƒƒé<EFBFBD>•î‡…啎婢跺洤褰為å¼?
|
||||||
, int code // 閸ョ偠鐨熸禍瀣╂娴狅絿鐖?
|
, int code // 閸ョå<EFBFBD> é<EFBFBD>¨ç†¸ç¦<EFBFBD>瀣╂娴狅絿é<EFBFBD>?
|
||||||
, void* data // 閸ョ偠鐨熸禍瀣╂閺佺増宓侀敍灞剧壌閹诡喕绨ㄦ禒鏈靛敩閻焦婀侀幍鈧稉宥呮倱閿涘苯寮悡褍鍙挎担鎾茬皑娴犺泛鐣炬稊?
|
, 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娴肩姴鍙嗛弮鍓佹畱娣囨繃瀵旀稉鈧懛?
|
, 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::lock_guard<std::mutex> lock(cb_lock_);
|
||||||
std::vector<SCNINST>::iterator it = std::find(g_scanner_instances.begin(), g_scanner_instances.end(), hdev);
|
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_COLOR_CORRECTION , OPTION_TITLE_SPJZ}
|
||||||
, {SANE_STD_OPT_NAME_DISCARDBLANK , OPTION_TITLE_TGKBY}
|
, {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"} // 姒涙垹娅ч崶鎯у剼閸欏秷澹婃潏鎾冲毉閿涘牊顒滅敮鎼侇杹閼硅弓璐熼敍?-姒涙垼澹婇敍?-閻у€熷閿?
|
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"} // 閻忔澘瀹抽幋鏍拨閻ц棄娴橀崓?- 闂勩倛澹?
|
, {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"} // 閼奉亜濮╅幖鎾剁剨瀵搫瀹?
|
, {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"} // " 閹兼挾鐒婇梼鍫濃偓?
|
, {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)
|
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_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 (*show_messagebox_ui)(HWND parent, int event, void* msg, int flag) = NULL;
|
||||||
int (*close_ui)(int) = 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;
|
char* (*get_config_content)(const char* dev_name, const char* name) = NULL;
|
||||||
void (*twain_ui_free)(void* buf) = 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)
|
, dpi_(200), tmp_path_(L""), img_ind_(0)
|
||||||
, scanner_name_(L""), cfg_(NULL), is_ui_wait_img_(false), is_scanning_(false)
|
, 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)
|
, 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)>();
|
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 ...
|
// this value is same as driver memory limit ...
|
||||||
max_img_mem_ = mem_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();
|
err_ = open();
|
||||||
}
|
}
|
||||||
scanner::~scanner()
|
scanner::~scanner()
|
||||||
|
@ -1203,7 +1208,7 @@ int scanner::init_options_id(void)
|
||||||
|
|
||||||
if (is_erase_hole_id_ == -1)
|
if (is_erase_hole_id_ == -1)
|
||||||
{
|
{
|
||||||
// 閸忕厧顔愰懓浣烘畱闂勩倕鐡熺粻妤佺《
|
// 閸忕厧顔愰懓浣烘畱闂勩倕é<EFBFBD>¡ç†ºç²»å¦¤ä½ºã€?
|
||||||
EXAPI ea;
|
EXAPI ea;
|
||||||
|
|
||||||
ea.ind = is_erase_hole_id_ = ex_id_++;
|
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*/)
|
if (img->bytes() /*>= simg->bytes*/)
|
||||||
{
|
{
|
||||||
size_t bytes = 0;
|
size_t bytes = 0;
|
||||||
int times = 0;
|
int times = 0, cnt0 = images_.count(&bytes), cnt = cnt0,
|
||||||
|
gap = 5, max_wait = wait_fetch_ / gap;
|
||||||
|
|
||||||
images_.count(&bytes);
|
|
||||||
img->set_image_status((SANE_Image_Statu)simg->flag.statu);
|
img->set_image_status((SANE_Image_Statu)simg->flag.statu);
|
||||||
bytes /= 1024 * 1024;
|
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));
|
std::this_thread::sleep_for(std::chrono::milliseconds(gap));
|
||||||
images_.count(&bytes);
|
cnt = images_.count(&bytes);
|
||||||
bytes /= 1024 * 1024;
|
bytes /= 1024 * 1024;
|
||||||
if (times == 1)
|
if (times == 1)
|
||||||
log_info(L"Memory usage upto limit! wait up to 100 ms ...\r\n", 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);
|
// 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));
|
// std::wstring msg(local_trans::a2u((char*)data, CP_UTF8));
|
||||||
// if (!IsWindow(app_wnd_))
|
// if (!IsWindow(app_wnd_))
|
||||||
|
|
|
@ -61,6 +61,7 @@ class scanner : public ISaneInvoker, virtual public refer
|
||||||
twain_xfer xfer_;
|
twain_xfer xfer_;
|
||||||
safe_img_queue images_;
|
safe_img_queue images_;
|
||||||
size_t max_img_mem_;
|
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_; //如果有界面,则全部保存从界面传回的消息;否则只保存开始扫描和结束扫描的事件
|
safe_queue<int> events_; //如果有界面,则全部保存从界面传回的消息;否则只保存开始扫描和结束扫描的事件
|
||||||
int ev_cnt_;
|
int ev_cnt_;
|
||||||
SANE_FinalImgFormat img_fmt_;
|
SANE_FinalImgFormat img_fmt_;
|
||||||
|
|
Loading…
Reference in New Issue