diff --git a/sane/scanner.cpp b/sane/scanner.cpp index 9d9cdc7..c466197 100644 --- a/sane/scanner.cpp +++ b/sane/scanner.cpp @@ -85,12 +85,12 @@ namespace callback std::vector g_scanner_instances; int sane_event_callback( // 濞夈劌鍞介崶鐐剁殶閻ㄥ嫬顕挒鈽呯礉闂団偓鐟曚椒绻氱拠浣筋嚉閸ョ偠鐨熼弰顖氼樋缁捐法鈻肩€瑰鍙忛惃? - SANE_Handle hdev // 娴溠呮晸娴滃娆㈤惃鍕啎婢跺洤褰為弻? - , int code // 閸ョ偠鐨熸禍瀣╂娴狅絿鐖? + SANE_Handle hdev // 娴溠呮晸娴滃娆㈤惃鍕啎婢跺洤褰為? + , int code // 閸ョ偠鐨熸禍瀣╂娴狅絿? , void* data // 閸ョ偠鐨熸禍瀣╂閺佺増宓侀敍灞剧壌閹诡喕绨ㄦ禒鏈靛敩閻焦婀侀幍鈧稉宥呮倱閿涘苯寮悡褍鍙挎担鎾茬皑娴犺泛鐣炬稊? - , unsigned int* len // 閺佺増宓侀梹鍨閿涘牆鐡ч懞鍌︾礆閿涘本鍨ㄩ懓鍗恦ent_data閻ㄥ嫮绱﹂崘鎻掑隘闂€鍨閿涘矁顕涚紒鍡氼嚞閻娴夋惔鏃傛畱娴滃娆㈡禒锝囩垳 + , unsigned int* len // 閺佺増宓侀梹鍨閿涘牆鐡ч懞鍌︾礆閿涘本鍨ㄩ懓鍗恦ent_data閻ㄥ嫮绱﹂崘鎻掑隘闂€鍨閿涘矁顕涚紒鍡氼嚞閻娴夋惔鏃傛畱娴滃娆㈡禒锝囩? , void* param // 閻劍鍩涢懛顏勭暰娑斿鏆熼幑顕嗙礉娑撳氦鐨熼悽鈺痑ne_init_ex娴肩姴鍙嗛弮鍓佹畱娣囨繃瀵旀稉鈧懛? - ) // 鏉╂柨娲栭崐闂寸贩娑撳秴鎮撻惃鍕皑娴犳湹鍞惍浣解偓灞界暰閿涘矂鈧艾鐖舵稉琛♀偓?閳? + ) // 鏉╂柨娲栭崐闂寸贩娑撳秴鎮撻惃鍕皑娴犳湹鍞惍浣解偓灞界暰閿涘矂鈧艾鐖舵稉琛♀?? { std::lock_guard lock(cb_lock_); std::vector::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"} // 姒涙垹娅ч崶鎯у剼閸欏秷澹婃潏鎾冲毉閿涘牊顒滅敮鎼侇杹閼硅弓璐熼?-姒涙垼澹婇敍?-閻у€熷? + , {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"} // " 閹兼挾鐒婇梼鍫濃? }; const char* option_title_2_name(const char* title) { @@ -352,7 +352,7 @@ namespace callback int (*show_progress_ui)(HWND parent, std::function callback, std::function* 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; // 鎼存梻鏁ら幐鍥х暰閻ㄥ嫰鍘ょ純顕嗙礉content娑撴椽鍘ょ純顔芥殶閹诡喗? 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(); @@ -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) { - // 閸忕厧顔愰懓浣烘畱闂勩倕鐡熺粻妤佺《 + // 閸忕厧顔愰懓浣烘畱闂勩倕鐡熺粻妤佺? 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) //闁挎瑨顕ゅ鐟板? // { // std::wstring msg(local_trans::a2u((char*)data, CP_UTF8)); // if (!IsWindow(app_wnd_)) diff --git a/sane/scanner.h b/sane/scanner.h index 2e144ca..e3bcf63 100644 --- a/sane/scanner.h +++ b/sane/scanner.h @@ -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 events_; //如果有界面,则全部保存从界面传回的消息;否则只保存开始扫描和结束扫描的事件 int ev_cnt_; SANE_FinalImgFormat img_fmt_;