解决测试过程中断开usb会出现卡死的问题

This commit is contained in:
yangjiaxuan 2023-12-18 17:12:46 +08:00
parent ae97584654
commit 2dfc05386d
2 changed files with 45 additions and 18 deletions

View File

@ -53,6 +53,7 @@ MainWindow::MainWindow(Dialog_logIn::LogInType loginType, const QString &profile
connect(this, SIGNAL(sane_dev_arrive(QString)), this, SLOT(on_sane_dev_arrive(QString)), Qt::QueuedConnection); connect(this, SIGNAL(sane_dev_arrive(QString)), this, SLOT(on_sane_dev_arrive(QString)), Qt::QueuedConnection);
connect(this, SIGNAL(sane_dev_remove(QString)), this, SLOT(on_sane_dev_remove(QString)), Qt::QueuedConnection); connect(this, SIGNAL(sane_dev_remove(QString)), this, SLOT(on_sane_dev_remove(QString)), Qt::QueuedConnection);
connect(this, &MainWindow::sane_create_interface, this, &MainWindow::on_sane_create_interface, Qt::QueuedConnection);
if (m_loginType == Dialog_logIn::LogInType_Burn) if (m_loginType == Dialog_logIn::LogInType_Burn)
{ {
@ -112,7 +113,7 @@ MainWindow::MainWindow(Dialog_logIn::LogInType loginType, const QString &profile
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
HGBase_EnterLock(m_lock); //HGBase_EnterLock(m_lock);
if (m_top_splitter != nullptr) if (m_top_splitter != nullptr)
{ {
while (0 != m_top_splitter->count()) while (0 != m_top_splitter->count())
@ -131,7 +132,7 @@ MainWindow::~MainWindow()
} }
} }
HGBase_LeaveLock(m_lock); //HGBase_LeaveLock(m_lock);
sane_exit(); sane_exit();
@ -254,7 +255,7 @@ bool MainWindow::AddInterface(Form_mainInterface * mainInterface)
{ {
assert(nullptr != mainInterface); assert(nullptr != mainInterface);
HGBase_EnterLock(m_lock); //HGBase_EnterLock(m_lock);
bool ret = false; bool ret = false;
if (m_top_splitter->count() < 2) if (m_top_splitter->count() < 2)
{ {
@ -266,7 +267,7 @@ bool MainWindow::AddInterface(Form_mainInterface * mainInterface)
m_bot_splitter->addWidget(mainInterface); m_bot_splitter->addWidget(mainInterface);
ret = true; ret = true;
} }
HGBase_LeaveLock(m_lock); //HGBase_LeaveLock(m_lock);
updateSplitter(); updateSplitter();
return ret; return ret;
@ -275,9 +276,11 @@ bool MainWindow::AddInterface(Form_mainInterface * mainInterface)
bool MainWindow::RemoveInterface(Form_mainInterface * mainInterface) bool MainWindow::RemoveInterface(Form_mainInterface * mainInterface)
{ {
assert(nullptr != mainInterface); assert(nullptr != mainInterface);
HGBase_EnterLock(m_lock); //HGBase_EnterLock(m_lock);
delete mainInterface; delete mainInterface;
HGBase_LeaveLock(m_lock); mainInterface = nullptr;
m_testingRef = 0;
//HGBase_LeaveLock(m_lock);
updateSplitter(); updateSplitter();
return true; return true;
} }
@ -343,17 +346,13 @@ int MainWindow::sane_ex_callback(SANE_Handle hdev, int code, void *data, unsigne
if (code == SANE_EVENT_IMAGE_OK || code == SANE_EVENT_SCAN_FINISHED || code == SANE_EVENT_ERROR || code == SANE_EVENT_STATUS) if (code == SANE_EVENT_IMAGE_OK || code == SANE_EVENT_SCAN_FINISHED || code == SANE_EVENT_ERROR || code == SANE_EVENT_STATUS)
{ {
HGBase_EnterLock(p->m_lock); SaneParams *saneParams = new SaneParams;
if (p->m_loginType != Dialog_logIn::LogInType_Burn) saneParams->hdev = hdev;
{ saneParams->code = code;
Form_mainInterface* mainInterface = p->FindInterface(hdev); saneParams->data = data;
if (nullptr != mainInterface) saneParams->len = len;
{
if (nullptr != mainInterface->getScanner() && nullptr != mainInterface->getScanner()->cb_) emit p->sane_create_interface(saneParams);
mainInterface->getScanner()->cb_(hdev, code, data, len, mainInterface->getScanner());
}
}
HGBase_LeaveLock(p->m_lock);
} }
return 0; return 0;
@ -496,7 +495,7 @@ void MainWindow::on_sane_dev_remove(QString devName)
if (mainInterface != nullptr) if (mainInterface != nullptr)
{ {
mainInterface->setDevDisconnect(); mainInterface->setDevDisconnect();
if (!mainInterface->isTesting()) //if (!mainInterface->isTesting())
{ {
RemoveInterface(mainInterface); RemoveInterface(mainInterface);
} }
@ -504,6 +503,24 @@ void MainWindow::on_sane_dev_remove(QString devName)
} }
} }
void MainWindow::on_sane_create_interface(SaneParams *saneParams)
{
if (m_loginType != Dialog_logIn::LogInType_Burn)
{
Form_mainInterface* mainInterface = FindInterface(saneParams->hdev);
if (nullptr != mainInterface)
{
if (nullptr != mainInterface->getScanner() && nullptr != mainInterface->getScanner()->cb_)
{
mainInterface->getScanner()->cb_(saneParams->hdev, saneParams->code, saneParams->data, saneParams->len, mainInterface->getScanner());
}
}
}
delete saneParams;
saneParams = nullptr;
}
void MainWindow::on_update_userStatus() void MainWindow::on_update_userStatus()
{ {
QString tips; QString tips;

View File

@ -46,13 +46,23 @@ private:
QString getDevType(SANE_Handle handle); QString getDevType(SANE_Handle handle);
QString getDevFwNum(SANE_Handle handle); QString getDevFwNum(SANE_Handle handle);
struct SaneParams
{
SANE_Handle hdev;
int code;
void *data;
unsigned int *len;
};
signals: signals:
void sane_dev_arrive(QString devName); void sane_dev_arrive(QString devName);
void sane_dev_remove(QString devName); void sane_dev_remove(QString devName);
void sane_create_interface(SaneParams *saneParams);
private slots: private slots:
void on_sane_dev_arrive(QString devName); void on_sane_dev_arrive(QString devName);
void on_sane_dev_remove(QString devName); void on_sane_dev_remove(QString devName);
void on_sane_create_interface(SaneParams *saneParams);
void on_update_userStatus(); void on_update_userStatus();
private slots: private slots: