解决五岳智能twain-app扫描时卡住的问题

This commit is contained in:
luoliangyi 2023-11-20 18:09:21 +08:00
parent e297b2cc9f
commit 461020ea72
2 changed files with 34 additions and 16 deletions

View File

@ -25,7 +25,7 @@ Manager::Manager()
connect(this, SIGNAL(init()), this, SLOT(on_init()));
connect(this, SIGNAL(createDeviceSelect(unsigned int)), this, SLOT(on_createDeviceSelect(unsigned int)));
connect(this, SIGNAL(createSettingUi(unsigned int)), this, SLOT(on_createSettingUi(unsigned int)));
connect(this, SIGNAL(createProgressUi(unsigned int)), this, SLOT(on_createProgressUi(unsigned int)));
connect(this, SIGNAL(createProgressUi(void *)), this, SLOT(on_createProgressUi(void *)));
connect(this, SIGNAL(createMessageBoxUi(unsigned int)), this, SLOT(on_createMessageBoxUi(unsigned int)));
connect(this, SIGNAL(createTwainSrcUi(unsigned int)), this, SLOT(on_createTwainSrcUi(unsigned int)));
connect(this, SIGNAL(createSaneSrcUi(unsigned int)), this, SLOT(on_createSaneSrcUi(unsigned int)));
@ -105,27 +105,46 @@ int Manager::showProgressUi(HWND parent, std::function<void (ui_result)> callbac
m_progressUiCallback = callback;
m_notify = notify;
unsigned int ThreadId = 0;
void *hStopEvent = nullptr;
#ifdef HG_CMP_MSC
if (qApp->thread() != QThread::currentThread())
{
ThreadId = GetCurrentThreadId();
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::showProgressUi] qApp->thread() != QThread::currentThread(), ThreadId=%u", ThreadId);
hStopEvent = ::CreateEvent(0, FALSE, FALSE, 0);
}
#endif
emit createProgressUi(ThreadId);
emit createProgressUi(hStopEvent);
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::showProgressUi] emit createProgressUi(ThreadId)");
#ifdef HG_CMP_MSC
if (0 != ThreadId)
if (nullptr != hStopEvent)
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
while (1)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
HANDLE arEvents[1] = { hStopEvent };
DWORD result = MsgWaitForMultipleObjectsEx(1, arEvents, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE);
if (result == WAIT_OBJECT_0 + 1) // msg received
{
continue;
}
else if (result == WAIT_OBJECT_0)
{
break;
}
else if (result == WAIT_IO_COMPLETION)
{
break;
}
}
CloseHandle(hStopEvent);
}
#endif
@ -398,7 +417,7 @@ void Manager::on_createSettingUi(unsigned int ThreadId)
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::on_createSettingUi] m_settingUi->show()");
}
void Manager::on_createProgressUi(unsigned int ThreadId)
void Manager::on_createProgressUi(void *hEvent)
{
if (nullptr != m_settingUi)
m_progressUiparent = (HGWindow)m_settingUi->winId();
@ -432,10 +451,9 @@ void Manager::on_createProgressUi(unsigned int ThreadId)
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::on_createProgressUi] m_progressUi->show()");
#ifdef HG_CMP_MSC
if (0 != ThreadId)
if (nullptr != hEvent)
{
::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::on_createProgressUi] PostThreadMessage(ThreadId, WM_QUIT, 0, 0)");
SetEvent((HANDLE)hEvent);
}
#endif
}

View File

@ -36,7 +36,7 @@ signals:
void init();
void createDeviceSelect(unsigned int ThreadId);
void createSettingUi(unsigned int ThreadId);
void createProgressUi(unsigned int ThreadId);
void createProgressUi(void *hEvent);
void createMessageBoxUi(unsigned int ThreadId);
void createTwainSrcUi(unsigned int ThreadId);
void createSaneSrcUi(unsigned int ThreadId);
@ -50,7 +50,7 @@ private slots:
void on_init();
void on_createDeviceSelect(unsigned int ThreadId);
void on_createSettingUi(unsigned int ThreadId);
void on_createProgressUi(unsigned int ThreadId);
void on_createProgressUi(void *hEvent);
void on_createMessageBoxUi(unsigned int ThreadId);
void on_createTwainSrcUi(unsigned int ThreadId);
void on_createSaneSrcUi(unsigned int ThreadId);