处理保持设置界面不关闭的扫描流程; 显示设置界面时EndXfer不阻塞,改在GetInfo中阻塞,以解决APP刷新最后一幅图片的问题

This commit is contained in:
gb 2023-05-18 10:40:35 +08:00
parent b522cd9836
commit efb252ddfa
2 changed files with 51 additions and 68 deletions

View File

@ -713,18 +713,36 @@ void scanner::apply_config(void)
} }
void scanner::on_ui_event(int uev, void* sender) void scanner::on_ui_event(int uev, void* sender)
{ {
if (uev == SANE_EVENT_SCAN_FINISHED || uev == SANE_EVENT_UI_CLOSE_CANCEL || uev == SANE_EVENT_UI_CLOSE_NORMAL) if (uev == SANE_EVENT_UI_CLOSE_SETTING)
{ {
is_scanning_ = false; // setting UI closed ...
is_scanning_ = is_show_setting_ = false;
if (setting_.get())
setting_.reset();
} }
int(__stdcall * h)(int, void*) = scanner_ev_handler_; else if (uev == SANE_EVENT_UI_CLOSE_NORMAL)
if (uev == SANE_EVENT_UI_CLOSE_CANCEL) // notify when following message SANE_EVENT_SCAN_FINISHED arrived
{ {
stop(); // scan complete
if (indicator_.get()) if (indicator_.get())
indicator_.reset(); indicator_.reset();
is_scanning_ = is_show_setting_;
} }
else if (h) else if (uev == SANE_EVENT_UI_CLOSE_CANCEL)
{
// scan cancelled
if (indicator_.get())
indicator_.reset();
stop(); // nothing to do, the finishing work do in SANE_EVENT_SCAN_FINISHED
}
else if (uev == SANE_EVENT_SCAN_FINISHED)
{
is_scanning_ = is_show_setting_;
}
int(__stdcall * h)(int, void*) = scanner_ev_handler_;
if (h)
{ {
h(uev, evh_param_); h(uev, evh_param_);
} }
@ -732,50 +750,6 @@ void scanner::on_ui_event(int uev, void* sender)
events_.save(uev, sizeof(uev)); events_.save(uev, sizeof(uev));
//if (uev == SANE_EVENT_UI_SCAN_COMMAND) //UI主动通知
//{
// int(__stdcall * h)(int, void*) = scanner_ev_handler_;
// if (h)
// {
// //wchar_t info[128] = { 0 };
// //(info, _countof(info) - 1, L"[CRAZY]%d scanner events stored but APP has no action, we try to trigger it ONCE ...\r\n", ev_cnt_);
// ev_cnt_;
// h(SANE_EVENT_UI_SCAN_COMMAND, evh_param_);
// return;
// }
//}
//if (uev == SANE_EVENT_SCAN_FINISHED || uev == SANE_EVENT_UI_CLOSE_NORMAL || uev == SANE_EVENT_UI_CLOSE_CANCEL)
//{
// if (uev == SANE_EVENT_UI_CLOSE_CANCEL)
// stop();
// is_scanning_ = false;
//}
//if (uev == SANE_EVENT_UI_CLOSE_CANCEL || uev == SANE_EVENT_UI_CLOSE_NORMAL || uev == SANE_EVENT_UI_CLOSE_SETTING)
//{
// events_.clear();
// uev = SANE_EVENT_UI_CLOSE_SETTING;
//}
//events_.save(uev, sizeof(uev));
//ev_cnt_++;
//if (ev_cnt_ == events_.count() &&
// (ev_cnt_ >= 5 || (ev_cnt_ > 1 && !is_scanning_)))
//{
// // maybe no event has been handled by APP, triggered by callback
// int(__stdcall * h)(int, void*) = scanner_ev_handler_;
// if (h)
// {
// wchar_t info[128] = { 0 };
// swprintf_s(info, _countof(info) - 1, L"[CRAZY]%d scanner events stored but APP has no action, we try to trigger it ONCE ...\r\n", ev_cnt_);
// ev_cnt_--;
// h(events_.take(), evh_param_);
// }
//}
} }
std::string scanner::choose_scanner(const std::vector<std::string>& scanners) std::string scanner::choose_scanner(const std::vector<std::string>& scanners)
{ {

View File

@ -933,7 +933,7 @@ Twpp::Result huagao_ds::deviceEventGet(const Twpp::Identity& origin, Twpp::Devic
Result huagao_ds::identityOpenDs(const Identity& id) Result huagao_ds::identityOpenDs(const Identity& id)
{ {
//singleton_ = CreateMutexA(NULL, FALSE, "LookitApp"); //singleton_ = CreateMutexA(NULL, FALSE, "LookitApp");
//if (GetLastError() == ERROR_ALREADY_EXISTS) { //如果已经存在同名的Mutex会得到这个错误. //if (GetLastError() == ERROR_ALREADY_EXISTS) { //å¦æžœå·²ç»<EFBFBD>存在å<EFBFBD>Œå<EFBFBD><EFBFBD>çš„Mutex会得到这个错è¯?
// CloseHandle(singleton_); // CloseHandle(singleton_);
// singleton_ = NULL; // singleton_ = NULL;
// showmsg("提示", 202); // showmsg("提示", 202);
@ -1027,20 +1027,22 @@ Result huagao_ds::pendingXfersGet(const Identity&, PendingXfers& data)
if (!scanner_.get()) if (!scanner_.get())
return seqError(); return seqError();
int cnt = get_scanned_image_count(-1); // 显示设置界é<C592>¢æ—¶ï¼Œä¸<C3A4>能阻塞在EndXfer,å<C592>¦åˆ™æœ€å<E282AC>Žä¸€å¼ å¾ç‰‡ä¼ è¾“å<E2809C>Žæ˜¾ç¤ºä¸<C3A4>出æ<C2BA>¥ï¼Œæ•…此处将原æ<C5B8>¥-1çš„å<E2809E>数改为ä¸<C3A4>等待ï¼?ã€æ˜¾ç¤ºè®¾ç½®ç•Œé<C592>¢æ—¶ç´æŽ¥è¿”åžæœ‰å¾ç‰?
// int cnt = get_scanned_image_count(-1);
int cnt = show_setting_ ? 1 : get_scanned_image_count(-1);
data.setCount(cnt); data.setCount(cnt);
return success(); return success();
} }
Result huagao_ds::pendingXfersEnd(const Identity& id, PendingXfers& data) Result huagao_ds::pendingXfersEnd(const Identity& id, PendingXfers& data)
{ {
return pendingXfersGet(id, data); return pendingXfersGet(id, data);
} }
Result huagao_ds::pendingXfersReset(const Identity&, PendingXfers& data) Result huagao_ds::pendingXfersReset(const Identity& id, PendingXfers& data)
{ {
pending_xfer_.clear(); pending_xfer_.clear();
data.setCount(get_scanned_image_count(-1));
return success(); return pendingXfersGet(id, data);
} }
Result huagao_ds::setupMemXferGet(const Identity& id, SetupMemXfer& data) Result huagao_ds::setupMemXferGet(const Identity& id, SetupMemXfer& data)
{ {
@ -1186,15 +1188,18 @@ Result huagao_ds::imageInfoGet(const Identity&, ImageInfo& data)
} }
else else
{ {
if (!scanner_->wait_image()) //if (!scanner_->wait_image())
//{
//// notifyCloseOk();
// return success(); // 好分数需è¦<C3A8>è¿”åžæˆ<C3A6>åŠ?
//}
if (get_scanned_image_count(-1) > 0) // 显示设置界é<C592>¢æ—¶ï¼Œä¸<C3A4>能阻塞在EndXfer,å<C592>¦åˆ™æœ€å<E282AC>Žä¸€å¼ å¾ç‰‡ä¼ è¾“å<E2809C>Žæ˜¾ç¤ºä¸<C3A4>出æ<C2BA>¥ï¼Œæ•…在此å<C2A4>šé˜»å¡žè°ƒç”¨
{ {
// notifyCloseOk();
return success(); // 好分数需要返回成功
}
ok = scanner_->get_first_image_header(&head, NULL, &res); ok = scanner_->get_first_image_header(&head, NULL, &res);
if (ok) if (ok)
dpi_ = res; dpi_ = res;
} }
}
if (ok) if (ok)
{ {
@ -1230,6 +1235,10 @@ Result huagao_ds::imageInfoGet(const Identity&, ImageInfo& data)
else else
{ {
load_sane_util::log_info(L" imageInfoGet is false\r\n", 0); load_sane_util::log_info(L" imageInfoGet is false\r\n", 0);
data.setHeight(0);
return { ReturnCode::XferDone, ConditionCode::Bummer };
} }
wchar_t buf[128]; wchar_t buf[128];
std::wstring f(L"imageInfoGet:"); std::wstring f(L"imageInfoGet:");
@ -1618,7 +1627,7 @@ Result huagao_ds::call(const Identity& origin, DataGroup dg, Dat dat, Msg msg, v
//FileTools::write_log("D:\\1.txt", "call:datagroup-"+to_string((int)dg)+"dat-"+to_string(int(dat))+"msg-"+to_string(int(msg))); //FileTools::write_log("D:\\1.txt", "call:datagroup-"+to_string((int)dg)+"dat-"+to_string(int(dat))+"msg-"+to_string(int(msg)));
Result rt; Result rt;
//trigger_ProcessEvent(dg, dat, msg); // some APPs may be not trigger (Control, Event, ProcessEvent), we help them :( ... // 云阅卷扫描端不等状态改变,直接取图,此处设置一次状态 2022-11-07 //trigger_ProcessEvent(dg, dat, msg); // some APPs may be not trigger (Control, Event, ProcessEvent), we help them :( ... // äºé˜…å<EFBFBD>·æ‰«æ<EFBFBD><EFBFBD>端ä¸<EFBFBD>等状æ€<EFBFBD>改å<EFBFBD>˜ï¼Œç´æŽ¥å<EFBFBD>å¾ï¼Œæ­¤å¤„设置一次状æ€?2022-11-07
rt = Base::call(origin, dg, dat, msg, data); rt = Base::call(origin, dg, dat, msg, data);
if (log_all_triple_ || ((int)rt.returnCode() && rt.returnCode() != ReturnCode::NotDsEvent)) if (log_all_triple_ || ((int)rt.returnCode() && rt.returnCode() != ReturnCode::NotDsEvent))
@ -1783,7 +1792,7 @@ void huagao_ds::init_support_caps(void)
} }
load_sane_util::log_info(m_bIndicator ? L"Set show indicator: true\r\n" : L"Set show indicator: false\r\n", 0); load_sane_util::log_info(m_bIndicator ? L"Set show indicator: true\r\n" : L"Set show indicator: false\r\n", 0);
// data.type // data.type
if (!data.operator bool()) //具有风险性 (和气) Twain sample app ,data.m_cont is null,but DotNet和气 data.m_cont not is null . if (!data.operator bool()) //具有风险æ€?(和气) Twain sample app ,data.m_cont is null,but DotNet(åŒæ°”) data.m_cont not is null .
{ {
data = Capability::createEnumeration<CapType::Indicators>({ FALSE,TRUE }, m_bIndicator ? 1 : 0, 1); data = Capability::createEnumeration<CapType::Indicators>({ FALSE,TRUE }, m_bIndicator ? 1 : 0, 1);
} }
@ -3588,15 +3597,15 @@ int huagao_ds::handle_scanner_event(int ev, bool from_event_proc)
show_setting_ = false; show_setting_ = false;
break; break;
case SANE_EVENT_UI_CLOSE_CANCEL: case SANE_EVENT_UI_CLOSE_CANCEL:
scanner_->stop(); //scanner_->stop();
//notifyCloseCancel(); // 修复点击进度框"取消"按钮UI不能正常结束的BUG - added on 2023-02-14 //notifyCloseCancel(); // ä¿®å¤<EFBFBD>ç¹å‡»è¿åº¦æ¡?å<>消"按é®ï¼ŒUIä¸<C3A4>能正常结æ<E2809C>Ÿçš„BUG - added on 2023-02-14
//break; //break;
case SANE_EVENT_UI_CLOSE_NORMAL: case SANE_EVENT_UI_CLOSE_NORMAL:
case SANE_EVENT_SCAN_FINISHED: case SANE_EVENT_SCAN_FINISHED:
scanner_->ui_hide(); //scanner_->ui_hide();
scanner_status_ = SCANNER_STATUS_STOPPED; // notifyCloseCancel is not need, because it done in EndXfer scanner_status_ = SCANNER_STATUS_STOPPED; // notifyCloseCancel is not need, because it done in EndXfer
if(show_setting_) //if(show_setting_)
notifyCloseCancel(); // notifyCloseCancel();
//notifyCloseOk(); //notifyCloseOk();
//break; //break;
break; break;