diff --git a/README b/README index c8d8765322a13acfbd596e132a547b8ceb4dc041..736d44b4382a14647a59c9c32c12281f02c261c7 100644 --- a/README +++ b/README @@ -19,11 +19,19 @@ cpp_threadpool find0xff 论坛:二维数组中找最大特征数组 https://goldenhawking.blog.csdn.net/article/details/116240710 + +fileLoadControl + 机械盘阵高并发——使用ImDisk 与 junction显著提高整体吞吐性能 + https://goldenhawking.blog.csdn.net/article/details/122093588 floodfill_mdf 作业讲评-二值矩阵避障最短路径算法 https://goldenhawking.blog.csdn.net/article/details/109411787 +findfoo + 大道至简-基于C的库封装发布技术 + https://goldenhawking.blog.csdn.net/article/details/119845838 + huarongdao 广度优先求解算法演示(华容道C++代码,速度2644组/秒) https://goldenhawking.blog.csdn.net/article/details/112414933 diff --git a/fileLoadControl/dialogfileloadctrl.cpp b/fileLoadControl/dialogfileloadctrl.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d83fc0180437c29928eb9a9dfa6bdfa97637abaf --- /dev/null +++ b/fileLoadControl/dialogfileloadctrl.cpp @@ -0,0 +1,336 @@ +#include "dialogfileloadctrl.h" +#include "ui_dialogfileloadctrl.h" +#include +#include +#include +#include +#include +#include +#include +DialogFileLoadCtrl::DialogFileLoadCtrl(QWidget *parent) + : QDialog(parent) + , ui(new Ui::DialogFileLoadCtrl) + , m_pMsgMd(new QStandardItemModel(this)) +{ + ui->setupUi(this); + m_nTimer = startTimer(10000); + loadSettings(); + ui->listView_msg->setModel(m_pMsgMd); + slot_msg(tr("Program Started")); + setWindowFlag(Qt::WindowMinMaxButtonsHint,true); +} + +DialogFileLoadCtrl::~DialogFileLoadCtrl() +{ + delete ui; +} + +void DialogFileLoadCtrl::timerEvent(QTimerEvent * evt) +{ + if (evt->timerId()==m_nTimer && ui->checkBox_watch->isChecked()) + { + if (ui->lineEdit_src_dir->text().trimmed().length()<2) + return; + slot_next_prg(-1); + slot_msg(tr("Start maintaining.")); + killTimer(m_nTimer); + m_nTimer = -1; + updateMap(); + cleanFile(); + m_nTimer = startTimer(10000); + slot_msg(tr("Completed.")); + slot_next_prg(0); + } +} + +void DialogFileLoadCtrl::cleanFile() +{ + quint8 cm = 0; + while (m_total_size > ui->doubleSpinBox_maxSz->value()*1024ll*1024ll*1024ll) + { + if (!m_cache_files.size()) + break; + qint64 tmf = m_cache_files.begin()->first; + QMap & mp = m_cache_files[tmf]; + QMap & ms = m_cache_sizes[tmf]; + if (!mp.size()) + { + m_cache_files.erase(tmf); + m_cache_sizes.erase(tmf); + } + else + { + QString fm = mp.begin().key(); + QFileInfo ifi = mp.begin().value(); + assert(m_total_size >= ifi.size()); + if (false==QFile::remove(fm)) + { + QString msg = tr("Force Deleting %1.").arg(fm); + //Force Delete Using https://github.com/michaelknigge/forcedel + for (int ntr = 0; ntr < 10 && QFileInfo::exists(fm); ++ntr) + { + QThread::msleep(200); + QStringList args; +#ifdef __gnu_linux__ + args<<"-f"; + args<lineEdit_src_dir->text()); + m_total_size = 0; + m_total_files = 0; + const qint64 bfMin = ui->doubleSpinBox_bkMinSz->value()*1e6+.5; + const qint64 bfMax = ui->doubleSpinBox_bkMaxSz->value()*1e6+.5; + const QStringList FMLst = ui->lineEdit_dst_filetypes->text().split("|",Qt::SkipEmptyParts); + QSet FMUpper; + foreach(QString ex, FMLst) + { + QString r = ex.toUpper().trimmed(); + if (r.length()) + FMUpper << r; + } + + foreach (QFileInfo i, lst) + { + QString fm = i.absoluteFilePath(); + long long sz = i.size(); + qint64 tm = i.fileTime(QFile::FileBirthTime).toMSecsSinceEpoch(); + //Judge Whether this file need to be copied. + bool NeedTrans = false; + //1. Type + QString strExt = i.suffix().toUpper().trimmed(); + if (strExt.length()<1) + strExt=":"; + if (FMUpper.contains(strExt) || FMUpper.isEmpty()) + { + //2. Size Range + if (sz>=bfMin && sz<=bfMax) + { + //3.First Descovered + if (!m_cache_files[tm].contains(fm)) + NeedTrans = true; + //4.Size Changed + else if (m_cache_sizes[tm][fm]!=sz) + NeedTrans = true; + } + } + if (NeedTrans) + TransFile(i); + + m_cache_files[tm][fm] = i; + m_cache_sizes[tm][fm] = sz; + m_total_size += sz; + ++m_total_files; + } + + QString msg = tr("Enuming %1 Files %2 Bytes.").arg(m_total_files).arg(m_total_size); + slot_next_prg(0); + slot_msg(msg); +} + +void DialogFileLoadCtrl::TransFile(QFileInfo ifile) +{ + if (ui->lineEdit_dst_dir->text().length()<2) + return; + QDir dirSrc(ui->lineEdit_src_dir->text()); + //Relative Path + QString srcFile = dirSrc.relativeFilePath(ifile.absoluteFilePath()); + QString relDir = dirSrc.relativeFilePath(ifile.absolutePath()); + //Make destin path + QDir dirDst(ui->lineEdit_dst_dir->text()); + QString dstDir = dirDst.absoluteFilePath(relDir); + QString dstFile = dirDst.absoluteFilePath(srcFile); + + //mkpath + QFileInfo info(dstDir); + if (!info.exists()) + dirDst.mkpath(dstDir); + //File + QFileInfo infof(dstFile); + if (infof.size()!=ifile.size()) + { + //Copy + QFile::remove(dstFile); + //Copy thread in line + QString msg; + std::atomic bOk (false); + std::thread t([&]()->void{ + if (true==QFile::copy(ifile.absoluteFilePath(),dstFile)) + msg = tr("Succ Copy %1 to %2.").arg(ifile.absoluteFilePath()).arg(dstFile); + else + msg = tr("Busy File %1 with %2 Bytes.").arg( ifile.absoluteFilePath()).arg(ifile.size()); + bOk = true; + }); + //Hold and wait + slot_next_prg(0); + quint8 trc = 0; + while (!bOk) + { + QThread::msleep(1); + if (++trc % 100==0) + slot_next_prg(0); + } + t.join(); + slot_msg(msg); + } +} + +QFileInfoList DialogFileLoadCtrl::enumFiles(QString dirS) +{ + QStringList lst; + lst<< "*.*"; + lst<< "*"; + QDir dir(dirS); + dir.makeAbsolute(); + QFileInfoList linfo = dir.entryInfoList(lst); + QFileInfoList lstRes; + foreach(QFileInfo i, linfo) + { + if (i.isDir()) + { + QString dn = i.fileName(); + + if (dn=="." ||dn==".." ) + continue; + QFileInfoList lst_sub = enumFiles(i.absoluteFilePath()); + std::copy(lst_sub.begin(),lst_sub.end(),std::back_inserter(lstRes)); + } + else + lstRes << i; + } + slot_next_prg(0); + return lstRes; +} + +void DialogFileLoadCtrl::slot_msg(QString s) +{ + QDateTime dtm = QDateTime::currentDateTime(); + QString dtms = dtm.toString("yyyy-MM-dd HH:mm:ss"); + QString m = dtms +">" + s; + m_pMsgMd->appendRow(new QStandardItem(m)); + if (m_pMsgMd->rowCount()>256) + m_pMsgMd->removeRows(0,m_pMsgMd->rowCount()-256); + ui->listView_msg->scrollToBottom(); + QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); +} + +void DialogFileLoadCtrl::on_pushButton_br_src_clicked() +{ + QString dirS = QFileDialog::getExistingDirectory(this,tr("Watching root"),ui->lineEdit_src_dir->text()); + if (dirS.length()<2) + return; + QFileInfo info(dirS); + ui->lineEdit_src_dir->setText(info.absoluteFilePath()); + saveSettings(); +} + +void DialogFileLoadCtrl::on_pushButton_br_dst_clicked() +{ + QString dirS = QFileDialog::getExistingDirectory(this,tr("backup root"),ui->lineEdit_dst_dir->text()); + if (dirS.length()<2) + return; + ui->lineEdit_dst_dir->setText(dirS); + saveSettings(); +} + +void DialogFileLoadCtrl::loadSettings() +{ + QSettings settings(QCoreApplication::applicationFilePath()+".ini",QSettings::IniFormat); + const QString lineEdit_src_dir = settings.value("ui/lineEdit_src_dir","").toString(); + ui->lineEdit_src_dir->setText(lineEdit_src_dir); + + const QString lineEdit_dst_dir = settings.value("ui/lineEdit_dst_dir","").toString(); + ui->lineEdit_dst_dir->setText(lineEdit_dst_dir); + + const QString lineEdit_dst_filetypes = settings.value("ui/lineEdit_dst_filetypes","bmp|Jpeg|Avi|Mpeg|Jpg|PNG|Tif|tiff").toString(); + ui->lineEdit_dst_filetypes->setText(lineEdit_dst_filetypes); + + const bool checkBox_watch = settings.value("ui/checkBox_watch",false).toBool(); + ui->checkBox_watch->setChecked(checkBox_watch); + + const double doubleSpinBox_maxSz = settings.value("ui/doubleSpinBox_maxSz",16).toDouble(); + ui->doubleSpinBox_maxSz->setValue(doubleSpinBox_maxSz); + + const double doubleSpinBox_bkMaxSz = settings.value("ui/doubleSpinBox_bkMaxSz",2000000).toDouble(); + ui->doubleSpinBox_bkMaxSz->setValue(doubleSpinBox_bkMaxSz); + + const double doubleSpinBox_bkMinSz = settings.value("ui/doubleSpinBox_bkMinSz",0).toDouble(); + ui->doubleSpinBox_bkMinSz->setValue(doubleSpinBox_bkMinSz); + +} +void DialogFileLoadCtrl::saveSettings() +{ + QSettings settings(QCoreApplication::applicationFilePath()+".ini",QSettings::IniFormat); + const QString lineEdit_src_dir = ui->lineEdit_src_dir->text(); + settings.setValue("ui/lineEdit_src_dir",lineEdit_src_dir); + + const QString lineEdit_dst_dir = ui->lineEdit_dst_dir->text(); + settings.setValue("ui/lineEdit_dst_dir",lineEdit_dst_dir); + + const QString lineEdit_dst_filetypes = ui->lineEdit_dst_filetypes->text(); + settings.setValue("ui/lineEdit_dst_filetypes",lineEdit_dst_filetypes); + + const bool checkBox_watch = ui->checkBox_watch->isChecked(); + settings.setValue("ui/checkBox_watch",checkBox_watch); + + const double doubleSpinBox_maxSz = ui->doubleSpinBox_maxSz->value(); + settings.setValue("ui/doubleSpinBox_maxSz",doubleSpinBox_maxSz); + + const double doubleSpinBox_bkMaxSz = ui->doubleSpinBox_bkMaxSz->value(); + settings.setValue("ui/doubleSpinBox_bkMaxSz",doubleSpinBox_bkMaxSz); + + const double doubleSpinBox_bkMinSz = ui->doubleSpinBox_bkMinSz->value(); + settings.setValue("ui/doubleSpinBox_bkMinSz",doubleSpinBox_bkMinSz); + +} + +void DialogFileLoadCtrl::on_checkBox_watch_clicked() +{ + saveSettings(); + slot_next_prg(ui->checkBox_watch->isChecked()?0:-1); +} + +void DialogFileLoadCtrl::slot_next_prg(int n) +{ + static char prg_val [] = ".-/|\\"; + static unsigned char ps = 0; + if (n<0) + ui->label_prg->setText(QString(prg_val[0])); + else + ui->label_prg->setText(QString(prg_val[++ps%4+1])); + QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + +} diff --git a/fileLoadControl/dialogfileloadctrl.h b/fileLoadControl/dialogfileloadctrl.h new file mode 100644 index 0000000000000000000000000000000000000000..69a441506210a9eba0e789bfcb15c6abe368a79b --- /dev/null +++ b/fileLoadControl/dialogfileloadctrl.h @@ -0,0 +1,48 @@ +#ifndef DIALOGFILELOADCTRL_H +#define DIALOGFILELOADCTRL_H + +#include +#include +#include +#include +#include +#include +#include +#include +QT_BEGIN_NAMESPACE +namespace Ui { class DialogFileLoadCtrl; } +QT_END_NAMESPACE + +class DialogFileLoadCtrl : public QDialog +{ + Q_OBJECT + +public: + DialogFileLoadCtrl(QWidget *parent = nullptr); + ~DialogFileLoadCtrl(); +protected: + void timerEvent(QTimerEvent * evt) override; + QFileInfoList enumFiles(QString dirS); + void updateMap(); + void cleanFile(); + void TransFile(QFileInfo ifile); +private slots: + void slot_msg(QString); + void slot_next_prg(int v); + void on_pushButton_br_src_clicked(); + void on_pushButton_br_dst_clicked(); + void on_checkBox_watch_clicked(); + +private: + void loadSettings(); + void saveSettings(); +private: + Ui::DialogFileLoadCtrl *ui = 0; + QStandardItemModel * m_pMsgMd = 0; + int m_nTimer = -1; + std::map > m_cache_files; + std::map > m_cache_sizes; + qint64 m_total_size = 0; + qint64 m_total_files = 0; +}; +#endif // DIALOGFILELOADCTRL_H diff --git a/fileLoadControl/dialogfileloadctrl.ui b/fileLoadControl/dialogfileloadctrl.ui new file mode 100644 index 0000000000000000000000000000000000000000..c4ac97704158b4b3eeac23cae628ab24832ffa0c --- /dev/null +++ b/fileLoadControl/dialogfileloadctrl.ui @@ -0,0 +1,228 @@ + + + DialogFileLoadCtrl + + + + 0 + 0 + 719 + 411 + + + + File Load Ctrl + + + + :/fileLoadControl.png:/fileLoadControl.png + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + + + Watching Folder + + + + + + + + + + ... + + + + + + + + + + + Destin Folder + + + + + + + + + + ... + + + + + + + + + + + Backup files with Size From + + + + + + + 3 + + + 0.000000000000000 + + + 2000000.000000000000000 + + + 1.000000000000000 + + + 0.000000000000000 + + + + + + + MB To + + + + + + + 3 + + + 0.000000000000000 + + + 2000000.000000000000000 + + + 1.000000000000000 + + + 2000000.000000000000000 + + + + + + + MB + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Total Keep Load + + + + + + + 3 + + + 0.001000000000000 + + + 1024.000000000000000 + + + 0.001000000000000 + + + 16.000000000000000 + + + + + + + GB + + + + + + + + + + + File Typs(| splitted, : mean empty) + + + + + + + + + + Running + + + + :/fileLoadControl.png:/fileLoadControl.png + + + + + + + . + + + + + + + + + + + + + + + diff --git a/fileLoadControl/fileLoadControl.ico b/fileLoadControl/fileLoadControl.ico new file mode 100644 index 0000000000000000000000000000000000000000..805d3178bd556d274aa6ee14e07be19bd9c0c418 Binary files /dev/null and b/fileLoadControl/fileLoadControl.ico differ diff --git a/fileLoadControl/fileLoadControl.png b/fileLoadControl/fileLoadControl.png new file mode 100644 index 0000000000000000000000000000000000000000..227716d3ff09d36477de9743735de2f3688da16e Binary files /dev/null and b/fileLoadControl/fileLoadControl.png differ diff --git a/fileLoadControl/fileLoadControl.pro b/fileLoadControl/fileLoadControl.pro new file mode 100644 index 0000000000000000000000000000000000000000..e2691a880cde8b25b50fdd9461b756b21b89e0bf --- /dev/null +++ b/fileLoadControl/fileLoadControl.pro @@ -0,0 +1,43 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any Qt feature that has been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp \ + dialogfileloadctrl.cpp + +HEADERS += \ + dialogfileloadctrl.h + +FORMS += \ + dialogfileloadctrl.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +RC_ICONS=fileLoadControl.ico + +DISTFILES += \ + fileLoadControl.ico\ + fileLoadControl_zh_CN.qm \ + fileLoadControl_zh_CN.ts + +TRANSLATIONS += fileLoadControl_zh_CN.ts + +RESOURCES += \ + resource.qrc diff --git a/fileLoadControl/fileLoadControl_zh_CN.qm b/fileLoadControl/fileLoadControl_zh_CN.qm new file mode 100644 index 0000000000000000000000000000000000000000..66f013177a53c583d183fe6913ec1bb76651adfd Binary files /dev/null and b/fileLoadControl/fileLoadControl_zh_CN.qm differ diff --git a/fileLoadControl/fileLoadControl_zh_CN.ts b/fileLoadControl/fileLoadControl_zh_CN.ts new file mode 100644 index 0000000000000000000000000000000000000000..c7dea514914d02665ab35cf43ff9c422896994c6 --- /dev/null +++ b/fileLoadControl/fileLoadControl_zh_CN.ts @@ -0,0 +1,128 @@ + + + + + DialogFileLoadCtrl + + + File Load Ctrl + 文件拷贝与配额控制 + + + + Watching Folder + 配额文件夹 + + + + + ... + ... + + + + Destin Folder + 目的文件夹 + + + + Backup files with Size From + 备份大小介于 + + + + MB To + MB 到 + + + + MB + MB的文件 + + + + Total Keep Load + 配额空间 + + + + GB + GB + + + + File Typs(| splitted, : mean empty) + 备份文件类型(|分割,:表示空扩展名) + + + + Running + 运行开关 + + + + . + . + + + + Program Started + 程序启动 + + + + Start maintaining. + 开始维护. + + + + Completed. + 完成. + + + + Fail Deleting %1. + 删除文件失败:%1. + + + + Busy File %1 with %2 Bytes. + Busy File %1 Bytes. + 文件尚在繁忙: %1 ,%2 字节. + + + + Force Deleting %1. + 强制删除文件:%1. + + + + Succ Deleting %1. + 删除文件成功:%1. + + + + Enuming %1 Files %2 Bytes. + 当前枚举到 %1 个文件,占用 %2 字节. + + + + Succ Copy %1 to %2. + 备份文件成功:%1 到 %2. + + + Fail Copy %1 to %2. + 备份文件失败:%1 到 %2. + + + + Watching root + 配额监视根文件夹 + + + + backup root + 备份目的根文件夹 + + + diff --git a/fileLoadControl/main.cpp b/fileLoadControl/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0d2e2980da8b96e2e7d97adf6591f25b0c31ebbf --- /dev/null +++ b/fileLoadControl/main.cpp @@ -0,0 +1,24 @@ +#include "dialogfileloadctrl.h" +#include +#include +#include +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + QTranslator qtTranslator; + qtTranslator.load("qt_" + QLocale::system().name(), + QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + a.installTranslator(&qtTranslator); + + QTranslator appTranslator; + QString strTransLocalFile =":/" + + QCoreApplication::applicationName()+"_"+ + QLocale::system().name()+".qm"; + appTranslator.load(strTransLocalFile ); + a.installTranslator(&appTranslator); + + + DialogFileLoadCtrl w; + w.show(); + return a.exec(); +} diff --git a/fileLoadControl/resource.qrc b/fileLoadControl/resource.qrc new file mode 100644 index 0000000000000000000000000000000000000000..02a3287dcc0f154cbc482893fa8e43f4f7a50c2d --- /dev/null +++ b/fileLoadControl/resource.qrc @@ -0,0 +1,7 @@ + + + fileLoadControl.png + fileLoadControl.ico + fileLoadControl_zh_CN.qm + + diff --git a/sdr_deepdetect/sdd_emitter/main.cpp b/sdr_deepdetect/sdd_emitter/main.cpp index a204d76220824b672d91a6cc2c6247fbfe2951b7..59f9fe2c13615e51419f53655cec4fa072bb3d82 100644 --- a/sdr_deepdetect/sdd_emitter/main.cpp +++ b/sdr_deepdetect/sdd_emitter/main.cpp @@ -182,7 +182,7 @@ int runSend() { tm_idle = time(0); char buf_tm[256]; - sprintf(buf_tm,"%d",tm_idle); + sprintf(buf_tm,"Time=%lld\n",tm_idle); int sl = strlen(buf_tm); mtx_data.lock(); std::copy(buf_tm,buf_tm+sl,std::back_inserter(lst_data));