#include "ToolDialog.h" #include #include #include #include #include #include "QtConcurrent" #define TIME_OUT 30 ToolDialogImpl::ToolDialogImpl(QWidget *parent, DllTool* pDllTool) : DllToolDialog(parent) //, m_pDllTool(pDllTool) { ui.setupUi(this); this->setWindowFlags(Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint /*| Qt::WindowStaysOnTopHint*/); connect(this, SIGNAL(sigUpdateUI()), this, SLOT(on_UpdateUI())); // 显示控件初始化 hwndUnit = new HWndUnit(this); Util::ShowUnitInWidget(ui.Image_widget, hwndUnit); m_nThreadState = 1; m_nImageIndex = 0; m_strFilePath = QCoreApplication::applicationDirPath() + "/..//SaveImage"; //获取exe路径 ui.editImagePath->setText(m_strFilePath); ui.spinBoxFreeTime->setSuffix("ms"); ui.spinBoxFreeTime->setRange(10,1000); ui.spinBoxFreeTime->setWrapping(true); ui.spinBoxFreeTime->setValue(100); ui.spinBoxMaxBufferSize->setSuffix("pix"); ui.spinBoxMaxBufferSize->setRange(10, 1000); ui.spinBoxMaxBufferSize->setWrapping(true); ui.spinBoxMaxBufferSize->setValue(100); m_bEnableSave = true; ui.checkBoxEnableSave->setChecked(m_bEnableSave); // 启动线程 m_SaveThreadPool.start( new _SaveThread(this) ); } ToolDialogImpl::~ToolDialogImpl() { m_nThreadState = 0; } VPEnum::RETURN_VALUE ToolDialogImpl::Execute() { QString strFileName; SAVE_IMG SaveImg; m_bEnableSave = ui.checkBoxEnableSave->isChecked(); if (m_Image.IsInitialized() && m_bEnableSave) { m_nImageIndex++; if (m_nImageIndex > 99999) { m_nImageIndex = 1; } SaveImg.hoImage = m_Image; switch (ui.comboBoxMode->currentIndex()) { case 0: strFileName = "Image_" + QString("%1").arg(m_nImageIndex, 5, 10, QChar('0'));//5代表宽度,10表示10进制,空位补零 break; case 1: strFileName = "Image_" + QDateTime::currentDateTime().toString("[MM-dd_hh_mm_ss_zzz]"); break; default: strFileName = "Image_" + QDateTime::currentDateTime().toString("[MM-dd_hh_mm_ss_zzz]"); break; } QString runPath = QCoreApplication::applicationDirPath(); //获取exe路径 SaveImg.strFileName = strFileName; SaveImg.strFilePath = m_strFilePath; SaveImg.nExecuteState = m_nExecuteState; SaveImg.bEnSaveImage = true; SaveImg.bEnSaveDumpWindow = false; SaveImg.bEnExecuteState = 0; SaveImg.nBufferSize = ui.spinBoxMaxBufferSize->value();; SaveImg.nFreeTime = ui.spinBoxFreeTime->value(); m_SaveImages.push_back(SaveImg); hwndUnit->ShowImage(m_Image); hwndUnit->Refresh(true); } return VPEnum::RETURN_VALUE::Success; } /// /// /// /// void ToolDialogImpl::Running(bool bRun) { } /// /// /// /// /// /// bool ToolDialogImpl::Serialized(QDataStream& ar, bool bIsOut) { int paranum;//参数数量 if (bIsOut)//保存参数流程 { paranum = 5; ar << paranum;//先保存参数数量 ar << (int)1 << (int)ui.comboBoxMode->currentIndex(); ar << (int)2 << m_strFilePath; ar << (int)3 << ui.spinBoxFreeTime->value(); ar << (int)4 << ui.spinBoxMaxBufferSize->value(); ar << (int)5 << ui.checkBoxEnableSave->isChecked(); } else//加载参数流程,参数加载顺序一定要跟保存顺序一致 { int nCurrentIndex = 0; int nFreeTime = 100; int nMaxBufferSize = 100; int para; ar >> paranum;//读取参数数量 for (int i = 0; i < paranum; i++) { ar >> para; switch (para) { case 1: ar >> nCurrentIndex; break; case 2: ar >> m_strFilePath; break; case 3: ar >> nFreeTime; break; case 4: ar >> nMaxBufferSize; break; case 5: ar >> m_bEnableSave; break; default: { qWarning() << "Serialized(In) Error"; return false; } break; } } ui.comboBoxMode->setCurrentIndex(nCurrentIndex); ui.editImagePath->setText(m_strFilePath); ui.spinBoxFreeTime->setValue(nFreeTime); ui.spinBoxMaxBufferSize->setValue(nMaxBufferSize); ui.checkBoxEnableSave->setChecked(m_bEnableSave); } return true; } /// /// 确定 /// void ToolDialogImpl::on_btnOK_clicked() { this->hide(); } /// /// 取消按钮 /// void ToolDialogImpl::on_btnCancel_clicked() { // 将本工具的恢复到打开工具之前的状态 RecoverData(); } /// /// 测试按钮 /// void ToolDialogImpl::on_btnExecute_clicked() { QElapsedTimer toolTimer; toolTimer.start(); // 发送事件 ToolEvent* pToolEvent = new ToolEvent(m_strPouName, m_strInstanceName, TOOL_EVENT_TYPE::TOOL_TRIGGER); QCoreApplication::sendEvent(m_pEventTarget, pToolEvent); // 统计返回值 VPEnum::RETURN_VALUE ret = pToolEvent->ret; double nExecTime = toolTimer.elapsed(); QString str; str = QString("耗时: %1 ms").arg(nExecTime, 0, 'G', 5); ui.label_time->setText(str); str = QString("状态: %1 ").arg(QMetaEnum::fromType().key((short)ret)); ui.label_state->setText(str); delete pToolEvent; } void ToolDialogImpl::on_UpdateUI() { ui.label_TempPath->setText(m_strTempPath); ui.label_BufferSize->setText(QString::number(m_SaveImages.size() )); } void ToolDialogImpl::on_btnChagePath_clicked() { QString directory = QFileDialog::getExistingDirectory(this ,"Save File" ); if (!directory.isEmpty() ) { m_strFilePath = directory + "\\"; ui.editImagePath->setText(m_strFilePath); } } //============================================================ // // Save 线程 // //============================================================ /// /// 线程函数 /// void _SaveThread::run() { // 调用函数执行任务 while (m_pDlg->m_nThreadState) { if (m_pDlg->m_SaveImages.size() > 0) { SAVE_IMG SaveImage = m_pDlg->m_SaveImages[0]; QString strProjectPath = "./"; QString strImagePath = SaveImage.strFilePath; QDir dir(strImagePath); if (!dir.exists()) { dir.mkdir(strImagePath); } // TODO: 在此处根据不同的模式,生成对应的路径(此处不管本地有没有改路径的文件夹,但是需要确保路径是合法的) // TODO: 如无特别情况,图像日志都会生成在工程目录下 if (SaveImage.bEnSaveDumpWindow) { try { DumpWindowImage(&SaveImage.hoDumpWindow, SaveImage.hvWindow); } catch (...) {} } QString str = SaveImage.strFilePath + "//" + SaveImage.strFileName; //HTuple path = HTuple(str.toLocal8Bit().toStdString().c_str()) ; HTuple path = HString::FromUtf8(str.toStdString().c_str()); try { if (SaveImage.hoImage.IsInitialized()) { WriteImage(SaveImage.hoImage, "bmp", 0, path ); } } catch (...) { qWarning() << "Error"; } m_pDlg->m_strTempPath = str + ".bmp"; Utility::qSleep(SaveImage.nFreeTime); m_pDlg->m_SaveImages.remove(0); } else { Utility::qSleep(1000); } emit m_pDlg->sigUpdateUI(); } return; }