From 6a8631625dda58e394189422ec1046be8be038ec Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Wed, 11 Oct 2023 13:54:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E5=BA=A6=E6=9D=A1=EF=BC=8C=E6=94=BE?= =?UTF-8?q?=E5=88=B0=E6=9C=80=E5=90=8E=E4=B8=80=E5=BC=A0=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E8=A2=AB=E5=8F=96=E8=B5=B0=E5=90=8E=E6=89=8D=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E3=80=82=EF=BC=88=E6=94=B9=E5=8E=9F=E6=9D=A5=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD=E7=9B=B4=E6=8E=A5=E8=B0=83=E7=94=A8=EF=BC=8C=E4=B8=BA?= =?UTF-8?q?=E5=9C=A8=E6=96=B0=E7=BA=BF=E7=A8=8B=E4=B8=AD=E7=AD=89=E5=BE=85?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=8F=96=E5=AE=8C=E5=90=8E=E5=86=8D=E8=B0=83?= =?UTF-8?q?=E7=94=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sane/scanner.cpp | 69 ++++++++++++++++++++++++++++++++---------------- sane/scanner.h | 32 ++++++++++++---------- 2 files changed, 64 insertions(+), 37 deletions(-) diff --git a/sane/scanner.cpp b/sane/scanner.cpp index 0be3f70..b2d5711 100644 --- a/sane/scanner.cpp +++ b/sane/scanner.cpp @@ -781,6 +781,38 @@ void __stdcall scanner::apply_scheme(gb::sane_config_schm* schm, void* param) ((scanner*)param)->apply_scheme(schm); } +void scanner::scan_done(void) +{ + std::string msg(scan_msg_); + + while (images_.count()) + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + + if (indicator_.get()) + indicator_->notify_scan_over(&msg[0], err_ != SCANNER_ERR_OK); + else if (ui_notify) + ui_notify(SANE_EVENT_SCAN_FINISHED, &msg[0], err_); + else + { + if (err_) + { + if (callback::show_messagebox_ui) + { + callback::show_messagebox_ui(app_wnd_, SANE_EVENT_SCAN_FINISHED, (void*)&msg[0], 0); + } + else // windows message box ... + { + std::wstring text(local_trans::a2u(msg.c_str(), CP_UTF8)); + if (!IsWindow(app_wnd_)) + callback::bring_message_box_topmost(local_trans::lang_trans_between_hz936(CONST_STRING_ERROR).c_str()); + MessageBoxW(app_wnd_, text.c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_ERROR).c_str(), MB_OK); + } + } + on_ui_event(SANE_EVENT_SCAN_FINISHED, (void*)SANE_EVENT_SCAN_FINISHED); + } + // is_scanning_ = false; +} + // IRef COM_API_IMPLEMENT(scanner, long, add_ref(void)) { @@ -1071,6 +1103,10 @@ int scanner::open(void) } int scanner::close(void) { + images_.clear(); + if (done_.get() && done_->joinable()) + done_->join(); + scanner_ev_handler_ = NULL; ui_hide(); callback::unreg_callback(this); @@ -1551,6 +1587,8 @@ int scanner::set_is_multiout(bool enable) int scanner::thread_start(void) { + scan_over_ = false; + int ret = hg_sane_middleware::instance()->start(handle_, NULL); // the third-APPs in linux will call 'stop' after every start, but it not happens in windows-apps, so we handle this as following ... @@ -1586,6 +1624,7 @@ int scanner::thread_start(void) else #endif { + scan_over_ = true; if (callback::close_ui) callback::close_ui(UI_INDICATOR); @@ -3597,29 +3636,13 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len) else if (ev_code == SANE_EVENT_SCAN_FINISHED) { err_ = *len; - if (indicator_.get()) - indicator_->notify_scan_over((char*)data, *len != SCANNER_ERR_OK); - else if (ui_notify) - ui_notify(ev_code, data, *len); - else - { - if (*len) - { - if (callback::show_messagebox_ui) - { - callback::show_messagebox_ui(app_wnd_, ev_code, (void*)data, 0); - } - else // windows message box ... - { - std::wstring msg(local_trans::a2u((char*)data, CP_UTF8)); - if (!IsWindow(app_wnd_)) - callback::bring_message_box_topmost(local_trans::lang_trans_between_hz936(CONST_STRING_ERROR).c_str()); - MessageBoxW(app_wnd_, msg.c_str(), local_trans::lang_trans_between_hz936(CONST_STRING_ERROR).c_str(), MB_OK); - } - } - on_ui_event(ev_code, (void*)ev_code); - } - // is_scanning_ = false; + scan_over_ = true; + scan_msg_ = data ? (char*)data : "OK"; + + if (done_.get() && done_->joinable()) + done_->join(); + done_.reset(new std::thread(&scanner::scan_done, this)); + // scan_done(); // invoking move to the last image fetched { wchar_t msg[128] = { 0 }; diff --git a/sane/scanner.h b/sane/scanner.h index b48a05c..a17ec40 100644 --- a/sane/scanner.h +++ b/sane/scanner.h @@ -57,12 +57,13 @@ class scanner : public ISaneInvoker, virtual public refer bool scan_err_; volatile bool is_ui_wait_img_; volatile bool is_scanning_; + volatile bool scan_over_; volatile bool user_cancel_; 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_; //如果有界面,则全部保存从界面传回的消息;否则只保存开始扫描和结束扫描的事件 + safe_queue events_; //如果有界面,则全部保存从界面传回的消息;否则只保存开始扫描和结束扫描的事? int ev_cnt_; SANE_FinalImgFormat img_fmt_; std::unique_ptr indicator_; @@ -70,6 +71,7 @@ class scanner : public ISaneInvoker, virtual public refer gb::scanner_cfg* cfg_; bool twain_set_; SANEAPI sane_api_; + std::unique_ptr done_; std::map sane_ids_; // std::function ui_notify; int(__stdcall* scanner_ev_handler_)(int, void*); @@ -192,6 +194,8 @@ class scanner : public ISaneInvoker, virtual public refer static bool is_option_float(int sn, void* param); static void __stdcall apply_scheme(gb::sane_config_schm* schm, void* param); + void scan_done(void); + public: scanner(SCANNERID id); protected: @@ -246,7 +250,7 @@ public: SANE_OPTION_ID(background_color_range); SANE_OPTION_ID(sharpen); SANE_OPTION_ID(erase_morr); - SANE_OPTION_ID(erase_grids); // 除网纹 + SANE_OPTION_ID(erase_grids); // 除网? SANE_OPTION_ID(error_extend); SANE_OPTION_ID(is_noise_modify); SANE_OPTION_ID(noise_threshold); @@ -261,7 +265,7 @@ public: SANE_OPTION_ID(blank_page_threshold); // 跳过空白页灵敏度 SANE_OPTION_ID(resolution); SANE_OPTION_ID(image_quality); - SANE_OPTION_ID(is_swap); // 交换正反面 + SANE_OPTION_ID(is_swap); // 交换正反? SANE_OPTION_ID(is_split); // 图像拆分 SANE_OPTION_ID(is_auto_deskew); // 自动纠偏 SANE_OPTION_ID(is_custom_gamma); @@ -289,25 +293,25 @@ public: SANE_OPTION_ID(dogear_size); SANE_OPTION_ID(is_check_skew); SANE_OPTION_ID(skew_range); - SANE_OPTION_ID(black_white_threshold); // 二值化图像阈值 + SANE_OPTION_ID(black_white_threshold); // 二值化图像阈? SANE_OPTION_ID(is_photo_mode); // 照片模式 SANE_OPTION_ID(double_feed_handle); // 双张图片处理 SANE_OPTION_ID(scan_when_paper_on); // 待纸扫描 SANE_OPTION_ID(feed_strength); // 分纸强度 SANE_OPTION_ID(power_scheme); // 休眠时间 SANE_OPTION_ID(is_auto_strength); // 自动搓纸强度 - SANE_OPTION_ID(feed_strength_value); // 自动搓纸强度设定值 + SANE_OPTION_ID(feed_strength_value); // 自动搓纸强度设定? SANE_OPTION_ID(is_reverse_bw); // 黑白图像反色输出 - SANE_OPTION_ID(is_erase_hole_l); // 穿孔移除 - 左 - SANE_OPTION_ID(search_hole_range_l); // 穿孔搜索范围 - 左 - SANE_OPTION_ID(is_erase_hole_r); // 穿孔移除 - 右 - SANE_OPTION_ID(search_hole_range_r); // 穿孔搜索范围 - 右 - SANE_OPTION_ID(is_erase_hole_t); // 穿孔移除 - 上 - SANE_OPTION_ID(search_hole_range_t); // 穿孔搜索范围 - 上 - SANE_OPTION_ID(is_erase_hole_b); // 穿孔移除 - 下 - SANE_OPTION_ID(search_hole_range_b); // 穿孔搜索范围 - 下 + SANE_OPTION_ID(is_erase_hole_l); // 穿孔移除 - ? + SANE_OPTION_ID(search_hole_range_l); // 穿孔搜索范围 - ? + SANE_OPTION_ID(is_erase_hole_r); // 穿孔移除 - ? + SANE_OPTION_ID(search_hole_range_r); // 穿孔搜索范围 - ? + SANE_OPTION_ID(is_erase_hole_t); // 穿孔移除 - ? + SANE_OPTION_ID(search_hole_range_t); // 穿孔搜索范围 - ? + SANE_OPTION_ID(is_erase_hole_b); // 穿孔移除 - ? + SANE_OPTION_ID(search_hole_range_b); // 穿孔搜索范围 - ? SANE_OPTION_ID(fold_direction); // 对折模式 - SANE_OPTION_ID(discardblank); // 跳过空白页 + SANE_OPTION_ID(discardblank); // 跳过空白? // SANE-ex option ID: SANE_OPTION_ID(ex_multiout_type); // int