整理twainui代码,解决内存泄露问题

This commit is contained in:
luoliangyi 2023-10-26 19:09:44 +08:00
parent 069407b74c
commit 5851064373
5 changed files with 308 additions and 285 deletions

View File

@ -8,7 +8,6 @@ SUBDIRS += \
HGSaneUser \ HGSaneUser \
HGVersion \ HGVersion \
HGScannerLib \ HGScannerLib \
HGUpload \
HGWebService \ HGWebService \
HGUpgrade \ HGUpgrade \
HGFWUpgrade \ HGFWUpgrade \
@ -36,9 +35,6 @@ HGScannerLib.depends = \
HGImgFmt \ HGImgFmt \
HGImgProc HGImgProc
HGUpload.depends = \
HGBase
HGWebService.depends = \ HGWebService.depends = \
HGBase \ HGBase \
HGImgFmt \ HGImgFmt \

View File

@ -8,7 +8,6 @@ SUBDIRS += \
HGTwainUser \ HGTwainUser \
HGVersion \ HGVersion \
HGScannerLib \ HGScannerLib \
HGUpload \
HGWebService \ HGWebService \
HGUpgrade \ HGUpgrade \
HGFWUpgrade \ HGFWUpgrade \
@ -36,9 +35,6 @@ HGScannerLib.depends = \
HGImgFmt \ HGImgFmt \
HGImgProc HGImgProc
HGUpload.depends = \
HGBase
HGWebService.depends = \ HGWebService.depends = \
HGBase \ HGBase \
HGImgFmt \ HGImgFmt \

View File

@ -18,24 +18,21 @@ Manager::Manager()
, m_settingUiCallback(std::function<void(ui_result)>()) , m_settingUiCallback(std::function<void(ui_result)>())
, m_settingUi(nullptr) , m_settingUi(nullptr)
, m_progressUi(nullptr) , m_progressUi(nullptr)
, m_msgBoxUi(nullptr)
{ {
HGBase_CreateEvent(HGFALSE, HGFALSE, &m_event);
qRegisterMetaType<HGImage>("HGImage"); qRegisterMetaType<HGImage>("HGImage");
connect(this, SIGNAL(init()), this, SLOT(on_init())); connect(this, SIGNAL(init()), this, SLOT(on_init()));
connect(this, SIGNAL(createDeviceSelect(bool)), this, SLOT(on_createDeviceSelect(bool))); connect(this, SIGNAL(createDeviceSelect(unsigned int)), this, SLOT(on_createDeviceSelect(unsigned int)));
connect(this, SIGNAL(createSettingUi(bool)), this, SLOT(on_createSettingUi(bool))); connect(this, SIGNAL(createSettingUi(unsigned int)), this, SLOT(on_createSettingUi(unsigned int)));
connect(this, SIGNAL(createProgressUi(bool)), this, SLOT(on_createProgressUi(bool))); connect(this, SIGNAL(createProgressUi(unsigned int)), this, SLOT(on_createProgressUi(unsigned int)));
connect(this, SIGNAL(createMessageBoxUi(bool)), this, SLOT(on_createMessageBoxUi(bool))); connect(this, SIGNAL(createMessageBoxUi(unsigned int)), this, SLOT(on_createMessageBoxUi(unsigned int)));
connect(this, SIGNAL(createTwainSrcUi(bool)), this, SLOT(on_createTwainSrcUi(bool))); connect(this, SIGNAL(createTwainSrcUi(unsigned int)), this, SLOT(on_createTwainSrcUi(unsigned int)));
connect(this, SIGNAL(createSaneSrcUi(bool)), this, SLOT(on_createSaneSrcUi(bool))); connect(this, SIGNAL(createSaneSrcUi(unsigned int)), this, SLOT(on_createSaneSrcUi(unsigned int)));
connect(this, SIGNAL(createAbnormalImgUi(bool, HGImage)), this, SLOT(on_createAbnormalImgUi(bool, HGImage)), Qt::BlockingQueuedConnection); connect(this, SIGNAL(createAbnormalImgUi(unsigned int, HGImage)), this, SLOT(on_createAbnormalImgUi(unsigned int, HGImage)));
connect(this, SIGNAL(deleteSettingUi()), this, SLOT(on_deleteSettingUi())); connect(this, SIGNAL(deleteSettingUi(unsigned int)), this, SLOT(on_deleteSettingUi(unsigned int)));
connect(this, SIGNAL(deleteProgressUi()), this, SLOT(on_deleteProgressUi())); connect(this, SIGNAL(deleteProgressUi(unsigned int)), this, SLOT(on_deleteProgressUi(unsigned int)));
connect(this, SIGNAL(deleteMessageBoxUi()), this, SLOT(on_deleteMessageBoxUi())); connect(this, SIGNAL(deleteMessageBoxUi(unsigned int)), this, SLOT(on_deleteMessageBoxUi(unsigned int)));
emit init(); emit init();
} }
@ -45,20 +42,22 @@ Manager::~Manager()
QCoreApplication::removeTranslator(&m_translator); QCoreApplication::removeTranslator(&m_translator);
if (936 == m_langCode) if (936 == m_langCode)
QCoreApplication::removeTranslator(&m_translator_qt); QCoreApplication::removeTranslator(&m_translator_qt);
HGBase_DestroyEvent(m_event);
} }
int Manager::showDeviceSelect(bool qt, const std::vector<DEVQUEUI>& devs) int Manager::showDeviceSelect(const std::vector<DEVQUEUI>& devs)
{ {
// param
m_DeviceSelectDevs = devs; m_DeviceSelectDevs = devs;
#ifdef HG_CMP_MSC
m_DeviceSelectThreadId = GetCurrentThreadId();
#endif
emit createDeviceSelect(qt);
unsigned int ThreadId = 0;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (qApp->thread() != QThread::currentThread())
ThreadId = GetCurrentThreadId();
#endif
emit createDeviceSelect(ThreadId);
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{ {
MSG msg; MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) while (GetMessage(&msg, NULL, 0, 0))
@ -69,11 +68,13 @@ int Manager::showDeviceSelect(bool qt, const std::vector<DEVQUEUI>& devs)
} }
#endif #endif
// ret
return m_DeviceSelectResult; return m_DeviceSelectResult;
} }
int Manager::showSettingUi(bool qt, SANE_Handle device, HWND parent, LPSANEAPI api, const char * devName, gb::scanner_cfg* cfg, bool with_scan, std::function<void (ui_result)> callback) int Manager::showSettingUi(SANE_Handle device, HWND parent, LPSANEAPI api, const char * devName, gb::scanner_cfg* cfg, bool with_scan, std::function<void (ui_result)> callback)
{ {
// param
m_device = device; m_device = device;
scanner_cfg_ = cfg; scanner_cfg_ = cfg;
m_settingUiParent = (HGWindow)parent; m_settingUiParent = (HGWindow)parent;
@ -81,28 +82,17 @@ int Manager::showSettingUi(bool qt, SANE_Handle device, HWND parent, LPSANEAPI a
m_devName = devName; m_devName = devName;
m_with_scan = with_scan; m_with_scan = with_scan;
m_settingUiCallback = callback; m_settingUiCallback = callback;
unsigned int ThreadId = 0;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
m_SettingUiThreadId = GetCurrentThreadId(); if (qApp->thread() != QThread::currentThread())
ThreadId = GetCurrentThreadId();
#endif #endif
emit createSettingUi(qt);
return 0; emit createSettingUi(ThreadId);
} /*
int Manager::showProgressUi(bool qt, HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify)
{
m_progressUiparent = (HGWindow)parent;
if (nullptr != m_settingUi)
m_progressUiparent = (HGWindow)m_settingUi->winId();
m_progressUiCallback = callback;
m_notify = notify;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
m_ProgressUiThreadId = GetCurrentThreadId(); if (0 != ThreadId)
#endif
emit createProgressUi(qt);
#ifdef HG_CMP_MSC
if (!qt)
{ {
MSG msg; MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) while (GetMessage(&msg, NULL, 0, 0))
@ -112,23 +102,59 @@ int Manager::showProgressUi(bool qt, HWND parent, std::function<void (ui_result)
} }
} }
#endif #endif
*/
return 0; return 0;
} }
int Manager::showMessageBoxUi(bool qt, HWND parent, int event, void *msg, int flag) int Manager::showProgressUi(HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify)
{ {
m_messageBoxUiParent = nullptr; // param
m_progressUiparent = (HGWindow)parent;
m_progressUiCallback = callback;
m_notify = notify;
unsigned int ThreadId = 0;
#ifdef HG_CMP_MSC
if (qApp->thread() != QThread::currentThread())
ThreadId = GetCurrentThreadId();
#endif
emit createProgressUi(ThreadId);
/*
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
#endif
*/
return 0;
}
int Manager::showMessageBoxUi(HWND parent, int event, void *msg, int flag)
{
// param
m_messageBoxUiParent = (HGWindow)parent;
m_notifyEvent = event; m_notifyEvent = event;
m_message = (char*)msg; m_message = (char*)msg;
m_flag = flag; m_flag = flag;
#ifdef HG_CMP_MSC
m_MessageBoxUiThreadId = GetCurrentThreadId();
#endif
emit createMessageBoxUi(qt);
unsigned int ThreadId = 0;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (qApp->thread() != QThread::currentThread())
ThreadId = GetCurrentThreadId();
#endif
emit createMessageBoxUi(ThreadId);
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{ {
MSG msg; MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) while (GetMessage(&msg, NULL, 0, 0))
@ -142,13 +168,9 @@ int Manager::showMessageBoxUi(bool qt, HWND parent, int event, void *msg, int fl
return 0; return 0;
} }
int Manager::showTwainSrcUi(bool qt, const TW_IDENTITY *vds, HGUInt count, const char* defDevName, HGWindow parent, TW_IDENTITY *ds) int Manager::showTwainSrcUi(const TW_IDENTITY *vds, HGUInt count, const char* defDevName, HGWindow parent, TW_IDENTITY *ds)
{ {
#ifdef HG_CMP_MSC
m_twainSrcUiThreadId = GetCurrentThreadId();
#endif
m_TwainSrcUiparent = parent; m_TwainSrcUiparent = parent;
m_vds.clear(); m_vds.clear();
for (int i = 0; i < count; ++i) for (int i = 0; i < count; ++i)
{ {
@ -157,9 +179,15 @@ int Manager::showTwainSrcUi(bool qt, const TW_IDENTITY *vds, HGUInt count, const
m_defDsName = defDevName; m_defDsName = defDevName;
memset(&m_ds, 0, sizeof(TW_IDENTITY)); memset(&m_ds, 0, sizeof(TW_IDENTITY));
emit createTwainSrcUi(qt); unsigned int ThreadId = 0;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (qApp->thread() != QThread::currentThread())
ThreadId = GetCurrentThreadId();
#endif
emit createTwainSrcUi(ThreadId);
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{ {
MSG msg; MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) while (GetMessage(&msg, NULL, 0, 0))
@ -169,18 +197,17 @@ int Manager::showTwainSrcUi(bool qt, const TW_IDENTITY *vds, HGUInt count, const
} }
} }
#endif #endif
// ret
memcpy(ds, &m_ds, sizeof(TW_IDENTITY)); memcpy(ds, &m_ds, sizeof(TW_IDENTITY));
return 0; return 0;
} }
int Manager::showSaneSrcUi(bool qt, const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll, int Manager::showSaneSrcUi(const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll,
SANEAPI* saneApi, char *manuName, unsigned int maxLen) SANEAPI* saneApi, char *manuName, unsigned int maxLen)
{ {
#ifdef HG_CMP_MSC // param
m_saneSrcUiThreadId = GetCurrentThreadId();
#endif
m_SaneSrcUiparent = parent; m_SaneSrcUiparent = parent;
m_saneSource.clear(); m_saneSource.clear();
const char **p1 = manuNames; const char **p1 = manuNames;
const char **p2 = sanePaths; const char **p2 = sanePaths;
@ -198,9 +225,15 @@ int Manager::showSaneSrcUi(bool qt, const char **manuNames, const char **sanePat
memset(&m_saneApi, 0, sizeof(SANEAPI)); memset(&m_saneApi, 0, sizeof(SANEAPI));
m_saneManuName.clear(); m_saneManuName.clear();
emit createSaneSrcUi(qt); unsigned int ThreadId = 0;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (qApp->thread() != QThread::currentThread())
ThreadId = GetCurrentThreadId();
#endif
emit createSaneSrcUi(ThreadId);
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{ {
MSG msg; MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) while (GetMessage(&msg, NULL, 0, 0))
@ -210,14 +243,17 @@ int Manager::showSaneSrcUi(bool qt, const char **manuNames, const char **sanePat
} }
} }
#endif #endif
// ret
*dll = m_saneDll; *dll = m_saneDll;
memcpy(saneApi, &m_saneApi, sizeof(SANEAPI)); memcpy(saneApi, &m_saneApi, sizeof(SANEAPI));
strcpy(manuName, m_saneManuName.c_str()); strcpy(manuName, m_saneManuName.c_str());
return 0; return 0;
} }
int Manager::showAbnormalImgUi(bool qt, SANE_Image *img) int Manager::showAbnormalImgUi(SANE_Image *img)
{ {
// param
HGUInt imgType = 0; HGUInt imgType = 0;
if (img->header.format == SANE_FRAME_GRAY) if (img->header.format == SANE_FRAME_GRAY)
{ {
@ -237,15 +273,15 @@ int Manager::showAbnormalImgUi(bool qt, SANE_Image *img)
HGImage image = NULL; HGImage image = NULL;
HGBase_CreateImageWithData(img->data, &imgInfo, &image); HGBase_CreateImageWithData(img->data, &imgInfo, &image);
unsigned int ThreadId = 0;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
m_abnormalImgThreadId = GetCurrentThreadId(); if (qApp->thread() != QThread::currentThread())
ThreadId = GetCurrentThreadId();
#endif #endif
emit createAbnormalImgUi(qt, image); emit createAbnormalImgUi(ThreadId, image);
HGBase_DestroyImage(image);
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (0 != ThreadId)
{ {
MSG msg; MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) while (GetMessage(&msg, NULL, 0, 0))
@ -256,22 +292,81 @@ int Manager::showAbnormalImgUi(bool qt, SANE_Image *img)
} }
#endif #endif
// ret
HGBase_DestroyImage(image);
return m_abnormalImgResult; return m_abnormalImgResult;
} }
void Manager::closeSettingUi() void Manager::closeSettingUi()
{ {
emit deleteSettingUi(); unsigned int ThreadId = 0;
#ifdef HG_CMP_MSC
if (qApp->thread() != QThread::currentThread())
ThreadId = GetCurrentThreadId();
#endif
emit deleteSettingUi(ThreadId);
/*
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
#endif
*/
} }
void Manager::closeProgressUi() void Manager::closeProgressUi()
{ {
emit deleteProgressUi(); unsigned int ThreadId = 0;
#ifdef HG_CMP_MSC
if (qApp->thread() != QThread::currentThread())
ThreadId = GetCurrentThreadId();
#endif
emit deleteProgressUi(ThreadId);
/*
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
#endif
*/
} }
void Manager::closeMessageBoxUi() void Manager::closeMessageBoxUi()
{ {
emit deleteMessageBoxUi(); unsigned int ThreadId = 0;
#ifdef HG_CMP_MSC
if (qApp->thread() != QThread::currentThread())
ThreadId = GetCurrentThreadId();
#endif
emit deleteMessageBoxUi(ThreadId);
/*
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
#endif
*/
} }
void Manager::clear_functions(void) void Manager::clear_functions(void)
@ -303,20 +398,21 @@ void Manager::on_init()
QCoreApplication::installTranslator(&m_translator_qt); QCoreApplication::installTranslator(&m_translator_qt);
} }
void Manager::on_createDeviceSelect(bool qt) void Manager::on_createDeviceSelect(unsigned int ThreadId)
{ {
Dialog_device_select *dlg = new Dialog_device_select(m_DeviceSelectDevs); Dialog_device_select dlg(m_DeviceSelectDevs);
dlg->exec(); dlg.exec();
m_DeviceSelectResult = dlg->getDevId(); m_DeviceSelectResult = dlg.getDevId();
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (0 != ThreadId)
{ {
::PostThreadMessage(m_DeviceSelectThreadId, WM_QUIT, 0, 0); ::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
} }
#endif #endif
} }
void Manager::on_createSettingUi(bool qt) void Manager::on_createSettingUi(unsigned int ThreadId)
{ {
QWidget *qParent = nullptr; QWidget *qParent = nullptr;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
@ -342,10 +438,22 @@ void Manager::on_createSettingUi(bool qt)
m_settingUi = new hg_settingdialog(this, m_device, &m_api, m_with_scan, m_devName.c_str(), scanner_cfg_, close_prog, qParent); m_settingUi = new hg_settingdialog(this, m_device, &m_api, m_with_scan, m_devName.c_str(), scanner_cfg_, close_prog, qParent);
m_settingUi->setModal(true); m_settingUi->setModal(true);
m_settingUi->show(); m_settingUi->show();
/*
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{
::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
}
#endif
*/
} }
void Manager::on_createProgressUi(bool qt) void Manager::on_createProgressUi(unsigned int ThreadId)
{ {
if (nullptr != m_settingUi)
m_progressUiparent = (HGWindow)m_settingUi->winId();
QWidget *qParent = nullptr; QWidget *qParent = nullptr;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (nullptr != m_progressUiparent) if (nullptr != m_progressUiparent)
@ -361,7 +469,6 @@ void Manager::on_createProgressUi(bool qt)
auto close_prog = [&](ui_result r) ->void auto close_prog = [&](ui_result r) ->void
{ {
//m_progressUi = nullptr;
if(m_progressUiCallback) if(m_progressUiCallback)
m_progressUiCallback(r); m_progressUiCallback(r);
@ -373,50 +480,44 @@ void Manager::on_createProgressUi(bool qt)
m_progressUi = new Dialog_progress_ui(this, close_prog, m_notify, qParent); m_progressUi = new Dialog_progress_ui(this, close_prog, m_notify, qParent);
m_progressUi->setModal(true); m_progressUi->setModal(true);
m_progressUi->show(); m_progressUi->show();
/*
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (0 != ThreadId)
{ {
::PostThreadMessage(m_ProgressUiThreadId, WM_QUIT, 0, 0); ::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
} }
#endif #endif
*/
} }
void Manager::on_createMessageBoxUi(bool qt) void Manager::on_createMessageBoxUi(unsigned int ThreadId)
{ {
if (m_msgBoxUi != nullptr)
{
delete m_msgBoxUi;
m_msgBoxUi = nullptr;
}
QWidget *qParent = nullptr; QWidget *qParent = nullptr;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
QWinWidget win(m_messageBoxUiParent);
if (nullptr != m_messageBoxUiParent) if (nullptr != m_messageBoxUiParent)
{ {
QWinWidget *win = new QWinWidget(m_messageBoxUiParent); win.showCentered();
win->showCentered(); qParent = &win;
qParent = win;
} }
#else #else
qParent = m_messageBoxUiParent; qParent = m_messageBoxUiParent;
#endif #endif
assert(m_msgBoxUi == nullptr); QMessageBox dlg(QMessageBox::Critical, tr("Prompt"), QString::fromStdString(m_message), QMessageBox::Ok, qParent);
m_msgBoxUi = new QMessageBox(QMessageBox::Critical, tr("Prompt"), QString::fromStdString(m_message), QMessageBox::Ok, qParent); dlg.setWindowFlags(Qt::SubWindow | Qt::Popup | Qt::WindowStaysOnTopHint);
m_msgBoxUi->setWindowFlags(Qt::SubWindow | Qt::Popup | Qt::WindowStaysOnTopHint); dlg.exec();
//m_msgBoxUi->setModal(true);
m_msgBoxUi->exec();
delete m_msgBoxUi;
m_msgBoxUi = nullptr;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (0 != ThreadId)
{ {
::PostThreadMessage(m_MessageBoxUiThreadId, WM_QUIT, 0, 0); ::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
} }
#endif #endif
} }
void Manager::on_createTwainSrcUi(bool qt) void Manager::on_createTwainSrcUi(unsigned int ThreadId)
{ {
QWidget *qParent = nullptr; QWidget *qParent = nullptr;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
@ -430,20 +531,21 @@ void Manager::on_createTwainSrcUi(bool qt)
qParent = m_TwainSrcUiparent; qParent = m_TwainSrcUiparent;
#endif #endif
Dialog_Twain_Source_Select *dlg = new Dialog_Twain_Source_Select (m_vds, m_defDsName, qParent); Dialog_Twain_Source_Select dlg(m_vds, m_defDsName, qParent);
if (dlg->exec()) if (dlg.exec())
{ {
dlg->GetIdentify(&m_ds); dlg.GetIdentify(&m_ds);
} }
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (0 != ThreadId)
{ {
::PostThreadMessage(m_twainSrcUiThreadId, WM_QUIT, 0, 0); ::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
} }
#endif #endif
} }
void Manager::on_createSaneSrcUi(bool qt) void Manager::on_createSaneSrcUi(unsigned int ThreadId)
{ {
QWidget *qParent = nullptr; QWidget *qParent = nullptr;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
@ -457,41 +559,37 @@ void Manager::on_createSaneSrcUi(bool qt)
qParent = m_SaneSrcUiparent; qParent = m_SaneSrcUiparent;
#endif #endif
Dialog_Source_Select *dlg = new Dialog_Source_Select (m_saneSource, qParent); Dialog_Source_Select dlg(m_saneSource, qParent);
if (dlg->exec()) if (dlg.exec())
{ {
m_saneManuName = dlg->GetManuName(); m_saneManuName = dlg.GetManuName();
m_saneDll = dlg->GetDll(); m_saneDll = dlg.GetDll();
dlg->GetSaneAPI(&m_saneApi); dlg.GetSaneAPI(&m_saneApi);
} }
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (0 != ThreadId)
{ {
::PostThreadMessage(m_saneSrcUiThreadId, WM_QUIT, 0, 0); ::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
} }
#endif #endif
} }
void Manager::on_createAbnormalImgUi(bool qt, HGImage image) void Manager::on_createAbnormalImgUi(unsigned int ThreadId, HGImage image)
{ {
Dialog_abnormal_img_select* dlg = nullptr; Dialog_abnormal_img_select dlg(image, m_progressUi);
dlg.exec();
m_abnormalImgResult = dlg.getUserSelect();
if (m_progressUi != nullptr)
dlg = new Dialog_abnormal_img_select(image, m_progressUi);
else
dlg = new Dialog_abnormal_img_select(image);
dlg->exec();
m_abnormalImgResult = dlg->getUserSelect();
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
if (!qt) if (0 != ThreadId)
{ {
::PostThreadMessage(m_abnormalImgThreadId, WM_QUIT, 0, 0); ::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
} }
#endif #endif
} }
void Manager::on_deleteSettingUi() void Manager::on_deleteSettingUi(unsigned int ThreadId)
{ {
if (m_settingUi != nullptr) if (m_settingUi != nullptr)
{ {
@ -499,9 +597,18 @@ void Manager::on_deleteSettingUi()
delete m_settingUi; delete m_settingUi;
m_settingUi = nullptr; m_settingUi = nullptr;
} }
/*
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{
::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
}
#endif
*/
} }
void Manager::on_deleteProgressUi() void Manager::on_deleteProgressUi(unsigned int ThreadId)
{ {
if (m_progressUi != nullptr) if (m_progressUi != nullptr)
{ {
@ -509,13 +616,25 @@ void Manager::on_deleteProgressUi()
delete m_progressUi; delete m_progressUi;
m_progressUi = nullptr; m_progressUi = nullptr;
} }
/*
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{
::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
}
#endif
*/
} }
void Manager::on_deleteMessageBoxUi() void Manager::on_deleteMessageBoxUi(unsigned int ThreadId)
{ {
if (m_msgBoxUi != nullptr) /*
#ifdef HG_CMP_MSC
if (0 != ThreadId)
{ {
delete m_msgBoxUi; ::PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
m_msgBoxUi = nullptr;
} }
#endif
*/
} }

View File

@ -17,14 +17,14 @@ public:
Manager(); Manager();
~Manager(); ~Manager();
int showDeviceSelect(bool qt, const std::vector<DEVQUEUI>& devs); int showDeviceSelect(const std::vector<DEVQUEUI>& devs);
int showSettingUi(bool qt, SANE_Handle device, HWND settingUiParent, LPSANEAPI api, const char * devName, gb::scanner_cfg* cfg, bool with_scan, std::function<void(ui_result)> callback); int showSettingUi(SANE_Handle device, HWND settingUiParent, LPSANEAPI api, const char * devName, gb::scanner_cfg* cfg, bool with_scan, std::function<void(ui_result)> callback);
int showProgressUi(bool qt, HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify); int showProgressUi(HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify);
int showMessageBoxUi(bool qt, HWND parent, int event, void *msg, int flag); int showMessageBoxUi(HWND parent, int event, void *msg, int flag);
int showTwainSrcUi(bool qt, const TW_IDENTITY *vds, HGUInt count, const char* defDevName, HGWindow parent, TW_IDENTITY *ds); int showTwainSrcUi(const TW_IDENTITY *vds, HGUInt count, const char* defDevName, HGWindow parent, TW_IDENTITY *ds);
int showSaneSrcUi(bool qt, const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll, int showSaneSrcUi(const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll,
SANEAPI* saneApi, char *manuName, unsigned int maxLen); SANEAPI* saneApi, char *manuName, unsigned int maxLen);
int showAbnormalImgUi(bool qt, SANE_Image *img); int showAbnormalImgUi(SANE_Image *img);
void closeSettingUi(); void closeSettingUi();
void closeProgressUi(); void closeProgressUi();
@ -34,50 +34,41 @@ public:
signals: signals:
void init(); void init();
void createDeviceSelect(bool qt); void createDeviceSelect(unsigned int ThreadId);
void createSettingUi(bool qt); void createSettingUi(unsigned int ThreadId);
void createProgressUi(bool qt); void createProgressUi(unsigned int ThreadId);
void createMessageBoxUi(bool qt); void createMessageBoxUi(unsigned int ThreadId);
void createTwainSrcUi(bool qt); void createTwainSrcUi(unsigned int ThreadId);
void createSaneSrcUi(bool qt); void createSaneSrcUi(unsigned int ThreadId);
void createAbnormalImgUi(bool qt, HGImage image); void createAbnormalImgUi(unsigned int ThreadId, HGImage image);
void deleteSettingUi(); void deleteSettingUi(unsigned int ThreadId);
void deleteProgressUi(); void deleteProgressUi(unsigned int ThreadId);
void deleteMessageBoxUi(); void deleteMessageBoxUi(unsigned int ThreadId);
void deleteManager();
private slots: private slots:
void on_init(); void on_init();
void on_createDeviceSelect(bool qt); void on_createDeviceSelect(unsigned int ThreadId);
void on_createSettingUi(bool qt); void on_createSettingUi(unsigned int ThreadId);
void on_createProgressUi(bool qt); void on_createProgressUi(unsigned int ThreadId);
void on_createMessageBoxUi(bool qt); void on_createMessageBoxUi(unsigned int ThreadId);
void on_createTwainSrcUi(bool qt); void on_createTwainSrcUi(unsigned int ThreadId);
void on_createSaneSrcUi(bool qt); void on_createSaneSrcUi(unsigned int ThreadId);
void on_createAbnormalImgUi(bool qt, HGImage image); void on_createAbnormalImgUi(unsigned int ThreadId, HGImage image);
void on_deleteSettingUi(); void on_deleteSettingUi(unsigned int ThreadId);
void on_deleteProgressUi(); void on_deleteProgressUi(unsigned int ThreadId);
void on_deleteMessageBoxUi(); void on_deleteMessageBoxUi(unsigned int ThreadId);
public: public:
QTranslator m_translator; QTranslator m_translator;
QTranslator m_translator_qt; QTranslator m_translator_qt;
int m_langCode; int m_langCode;
HGEvent m_event;
std::vector<DEVQUEUI> m_DeviceSelectDevs; std::vector<DEVQUEUI> m_DeviceSelectDevs;
#ifdef HG_CMP_MSC
unsigned long m_DeviceSelectThreadId;
#endif
int m_DeviceSelectResult; int m_DeviceSelectResult;
hg_settingdialog *m_settingUi; hg_settingdialog *m_settingUi;
#ifdef HG_CMP_MSC
unsigned long m_SettingUiThreadId;
#endif
SANE_Handle m_device; SANE_Handle m_device;
HGWindow m_settingUiParent; HGWindow m_settingUiParent;
SANEAPI m_api; SANEAPI m_api;
@ -88,40 +79,24 @@ public:
Dialog_progress_ui *m_progressUi; Dialog_progress_ui *m_progressUi;
HGWindow m_progressUiparent; HGWindow m_progressUiparent;
#ifdef HG_CMP_MSC
unsigned long m_ProgressUiThreadId;
#endif
std::function<void (ui_result)> m_progressUiCallback; std::function<void (ui_result)> m_progressUiCallback;
std::function<void (int, void *, int)> *m_notify; std::function<void (int, void *, int)> *m_notify;
QMessageBox *m_msgBoxUi;
#ifdef HG_CMP_MSC
unsigned long m_MessageBoxUiThreadId;
#endif
HGWindow m_messageBoxUiParent; HGWindow m_messageBoxUiParent;
int m_notifyEvent; int m_notifyEvent;
std::string m_message; std::string m_message;
int m_flag; int m_flag;
#ifdef HG_CMP_MSC
unsigned long m_twainSrcUiThreadId;
#endif
std::vector<TW_IDENTITY> m_vds; std::vector<TW_IDENTITY> m_vds;
std::string m_defDsName; std::string m_defDsName;
HGWindow m_TwainSrcUiparent; HGWindow m_TwainSrcUiparent;
TW_IDENTITY m_ds; TW_IDENTITY m_ds;
#ifdef HG_CMP_MSC
unsigned long m_saneSrcUiThreadId;
#endif
std::vector<std::pair<std::string, std::string> > m_saneSource; std::vector<std::pair<std::string, std::string> > m_saneSource;
HGWindow m_SaneSrcUiparent; HGWindow m_SaneSrcUiparent;
HGDll m_saneDll; HGDll m_saneDll;
SANEAPI m_saneApi; SANEAPI m_saneApi;
std::string m_saneManuName; std::string m_saneManuName;
#ifdef HG_CMP_MSC
unsigned long m_abnormalImgThreadId;
#endif
int m_abnormalImgResult; int m_abnormalImgResult;
}; };

View File

@ -40,7 +40,7 @@ static void HGAPI ThreadFunc(HGThread thread, HGPointer param)
} }
} }
int choose_scanner(const std::vector<DEVQUEUI> &devs) static void Init()
{ {
if (!qApp) if (!qApp)
{ {
@ -48,28 +48,28 @@ int choose_scanner(const std::vector<DEVQUEUI> &devs)
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread); HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event); HGBase_WaitEvent(g_event);
} }
else
{
if (NULL == g_manager) if (NULL == g_manager)
{ {
g_manager = new Manager; g_manager = new Manager;
//g_manager->moveToThread(qApp->thread());
}
} }
return g_manager->showDeviceSelect(nullptr == g_hThread, devs); assert(nullptr != g_manager);
}
int choose_scanner(const std::vector<DEVQUEUI> &devs)
{
Init();
return g_manager->showDeviceSelect(devs);
} }
char *apply_current_config(const char *dev_name, SANE_Handle device, LPSANEAPI api) // this function only called after scanner open char *apply_current_config(const char *dev_name, SANE_Handle device, LPSANEAPI api) // this function only called after scanner open
{ {
if (!qApp) Init();
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
if (NULL == g_manager)
{
g_manager = new Manager;
}
dev_que devQue; dev_que devQue;
gb::scanner_cfg *cur_cfg_ = nullptr; gb::scanner_cfg *cur_cfg_ = nullptr;
@ -195,88 +195,38 @@ void twain_ui_free(void *buf)
int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char *devName, bool with_scan, std::function<void(ui_result)> callback) int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char *devName, bool with_scan, std::function<void(ui_result)> callback)
{ {
if (!qApp) Init();
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
if (NULL == g_manager) return g_manager->showSettingUi(device, parent, api, devName, scanner_cfg_, with_scan, callback);
{
g_manager = new Manager;
}
return g_manager->showSettingUi(nullptr == g_hThread, device, parent, api, devName, scanner_cfg_, with_scan, callback);
} }
int show_progress_ui(HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify) int show_progress_ui(HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify)
{ {
if (!qApp) Init();
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
if (NULL == g_manager) return g_manager->showProgressUi(parent, callback, notify);
{
g_manager = new Manager;
}
return g_manager->showProgressUi(nullptr == g_hThread, parent, callback, notify);
} }
int show_messagebox_ui(HWND parent, int event, void *msg, int flag) int show_messagebox_ui(HWND parent, int event, void *msg, int flag)
{ {
if (!qApp) Init();
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
if (NULL == g_manager) return g_manager->showMessageBoxUi(parent, event, msg, flag);
{
g_manager = new Manager;
}
return g_manager->showMessageBoxUi(nullptr == g_hThread, parent, event, msg, flag);
} }
int show_twain_srclist_ui(const TW_IDENTITY *vds, HGUInt count, const HGChar *defDsName, HGWindow parent, TW_IDENTITY *ds) int show_twain_srclist_ui(const TW_IDENTITY *vds, HGUInt count, const HGChar *defDsName, HGWindow parent, TW_IDENTITY *ds)
{ {
if (!qApp) Init();
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
if (NULL == g_manager) return g_manager->showTwainSrcUi(vds, count, defDsName, parent, ds);
{
g_manager = new Manager;
}
return g_manager->showTwainSrcUi(nullptr == g_hThread, vds, count, defDsName, parent, ds);
} }
int show_srclist_ui(const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll, int show_srclist_ui(const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll,
SANEAPI* saneApi, char *manuName, unsigned int maxLen) SANEAPI* saneApi, char *manuName, unsigned int maxLen)
{ {
if (!qApp) Init();
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
if (NULL == g_manager) return g_manager->showSaneSrcUi(manuNames, sanePaths, parent, dll, saneApi, manuName, maxLen);
{
g_manager = new Manager;
}
return g_manager->showSaneSrcUi(nullptr == g_hThread, manuNames, sanePaths, parent, dll, saneApi, manuName, maxLen);
} }
int close_ui(int which) int close_ui(int which)
@ -305,17 +255,14 @@ int close_ui(int which)
if (nullptr == g_hThread) if (nullptr == g_hThread)
{ {
if (NULL != g_manager) //g_manager->moveToThread(QThread::currentThread());
{
delete g_manager; delete g_manager;
g_manager = nullptr; g_manager = nullptr;
} }
}
else else
{ {
#if 0 #if 0
QApplication::exit(); QApplication::exit();
HGBase_CloseThread(g_hThread); HGBase_CloseThread(g_hThread);
g_hThread = NULL; g_hThread = NULL;
HGBase_DestroyEvent(g_event); HGBase_DestroyEvent(g_event);
@ -334,17 +281,7 @@ void pump_ui_message(void* reserved)
int abnormal_image(SANE_Image *img, HGWindow parent) int abnormal_image(SANE_Image *img, HGWindow parent)
{ {
if (!qApp) Init();
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &g_event);
HGBase_OpenThread(ThreadFunc, NULL, &g_hThread);
HGBase_WaitEvent(g_event);
}
if (NULL == g_manager) return g_manager->showAbnormalImgUi(img);
{
g_manager = new Manager;
}
return g_manager->showAbnormalImgUi(nullptr == g_hThread, img);
} }