Răsfoiți Sursa

多进程改成同时8个, CDR文件使用一次不要太多文件

蘭雅sRGB 11 luni în urmă
părinte
comite
d06241ab8a
4 a modificat fișierele cu 38 adăugiri și 310 ștergeri
  1. 13 1
      GuiApp/GuiMain.cpp
  2. 0 307
      GuiApp/GuiMain.cpp.orig
  3. 1 0
      GuiApp/GuiMain.h
  4. 24 2
      GuiApp/GuiThumbnail.cpp

+ 13 - 1
GuiApp/GuiMain.cpp

@@ -88,7 +88,11 @@ void InitXC_Window(HWINDOW& hWindow)
     HELE runButton = XBtn_Create(656, 40, 90, 40, L"开始执行", hWindow);
     XEle_EnableToolTips(runButton, true);
     XEle_SetToolTips(runButton, L"开始执行提取缩略图");
+
     HELE closeButton = XBtn_Create(656, 88, 90, 32, L"保存关闭", hWindow);
+    HELE removeButton = XBtn_Create(656, 128, 90, 32, L"清理缩略图", hWindow);
+
+
 
 //    // 注册文本框输入事件
 //    XEle_RegisterEvent(keyEdit, XE_EDIT_CHANGE, keyEditChange);
@@ -98,7 +102,7 @@ void InitXC_Window(HWINDOW& hWindow)
     XEle_RegisterEvent(pathButton, XE_BNCLICK, pathBtnClick);
     XEle_RegisterEvent(runButton, XE_BNCLICK, runBtnClick);
     XEle_RegisterEvent(closeButton, XE_BNCLICK, closeBtnClick);
-
+    XEle_RegisterEvent(removeButton, XE_BNCLICK, removeBtnClick);
 
     //创建列表元素
     hList = XList_Create(1, 25, 650, 518, hWindow);
@@ -210,6 +214,14 @@ bool CALLBACK closeBtnClick(HELE hEle, HELE hEventEle)
     return true;
 }
 
+// 清理缩略图目录下图片索引文件
+bool CALLBACK removeBtnClick(HELE hEle, HELE hEventEle)
+{
+    int ret = MessageBoxW(NULL, savePath, L"目前只能手工清理", MB_OK);
+    ShellExecuteW(NULL, L"open", savePath, NULL, NULL, SW_SHOW);
+
+    return true;
+}
 
 // 选择的文件全名 和路径
 wstring select_filename, select_filepath;

+ 0 - 307
GuiApp/GuiMain.cpp.orig

@@ -1,307 +0,0 @@
-#include "GuiThumbnail.h"
-#include "GuiMain.h"
-#include <wchar.h>
-#include <regex>
-#include "xcgui.h"
-
-// 全局变量
-char ConfigFile[MAX_PATH] = {0};
-WCHAR keyFile[MAX_PATH] =  L"";
-WCHAR savePath[MAX_PATH] = L"D:\\Thumbs缩略图";
-
-// 全局句柄
-HWINDOW hWindow;
-HELE  keyEdit, pathEdit, hList, hStatic;
-HELE hPic1, hPic2, hPic3;
-
-
-int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
-{
-    Everything_Start();
-    XInitXCGUI(); // 初始化
-
-
-    extern char ConfigFile[MAX_PATH];
-    GetAppDir(ConfigFile);
-    strcat(ConfigFile, "/ACThumbs.ini");
-    if (IsFileExist(ConfigFile))
-        LoadConfigFile();
-
-    hWindow = XWnd_CreateWindow(0, 0, 960, 600, L"Adobe AI EPS INDD PDF和CorelDRAW 缩略图工具  版权所有 2013-2024 Hongwenjun (蘭雅)"); // 创建窗口
-    if (hWindow) {
-        // 设置图标
-        HICON logo_hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICON1);
-        XWnd_SetIcon(hWindow, logo_hIcon, false);
-        InitXC_Window(hWindow); // 窗口布局
-
-        XWnd_ShowWindow(hWindow, SW_SHOW); //显示窗口
-        XRunXCGUI(); //运行
-    }
-    return 0;
-}
-
-
-// 读取和保存配置
-void LoadConfigFile()
-{
-    wfstream wFile(ConfigFile, fstream::in);
-    wFile.imbue(locale("chs"));
-    wFile.getline(keyFile, MAX_PATH);
-    wFile.getline(savePath, MAX_PATH);
-    wFile.close();
-}
-void SaveConfigFile()
-{
-    wfstream wFile(ConfigFile, fstream::out);
-    wFile.imbue(locale("chs"));
-    wFile << keyFile << endl << savePath << endl;
-    wFile.close();
-}
-
-
-// 文本框回写配置
-bool edit_text(void)
-{
-    XEdit_GetText(keyEdit, keyFile, MAX_PATH);
-    XEdit_GetText(pathEdit, savePath, MAX_PATH);
-
-    return true;
-}
-
-// 窗口布局
-void InitXC_Window(HWINDOW& hWindow)
-{
-//   XWnd_SetImage(hWindow, XImage_LoadFile(L"GuiBG.dll")); // 设置窗口背景图片
-
-    // 创建编辑框
-    keyEdit = XEdit_Create(1, 2, 300, 22, hWindow);
-    pathEdit = XEdit_Create(410, 2, 241, 22, hWindow);
-
-    // 读取配置到文本框
-    XEdit_SetText(keyEdit, keyFile);
-    XEdit_SetText(pathEdit, savePath);
-
-
-    // 工具提示按钮
-    HELE keyButton = XBtn_Create(306, 2, 98, 22,  L"关键字 --> 搜索", hWindow);
-    XEle_EnableToolTips(keyButton, true);
-    XEle_SetToolTips(keyButton, L"请输入关键字,用空格隔开");
-
-    HELE pathButton = XBtn_Create(656, 2, 90, 32, L"选择目录", hWindow);
-    XEle_EnableToolTips(pathButton, true);
-    XEle_SetToolTips(pathButton, L"选择缩略图保存的目录");
-
-    HELE runButton = XBtn_Create(656, 40, 90, 40, L"开始执行", hWindow);
-    XEle_EnableToolTips(runButton, true);
-    XEle_SetToolTips(runButton, L"开始执行提取缩略图");
-    HELE closeButton = XBtn_Create(656, 88, 90, 32, L"保存关闭", hWindow);
-
-//    // 注册文本框输入事件
-//    XEle_RegisterEvent(keyEdit, XE_EDIT_CHANGE, keyEditChange);
-
-    // 注册按钮事件
-    XEle_RegisterEvent(keyButton, XE_BNCLICK, keyBtnClick);
-    XEle_RegisterEvent(pathButton, XE_BNCLICK, pathBtnClick);
-    XEle_RegisterEvent(runButton, XE_BNCLICK, runBtnClick);
-    XEle_RegisterEvent(closeButton, XE_BNCLICK, closeBtnClick);
-
-
-    //创建列表元素
-    hList = XList_Create(1, 25, 650, 518, hWindow);
-
-    //添加列表头
-    XList_AddColumn(hList, 260, L"名称", 2);
-    XList_AddColumn(hList, 260, L"路径", 2);
-    XList_AddColumn(hList, 100, L"文件版本", 2);
-
-    // 创建静态文本
-    hStatic = XStatic_Create(1, 545, 650, 22, L"Adobe AI EPS INDD PDF和CorelDRAW 缩略图工具  版权所有 2013-2024 Hongwenjun (蘭雅)", hWindow);
-
-    XStatic_Create(760, 165, 160, 18, L"兰雅VBA代码分享 lyvba.com", hWindow);
-
-    //创建图片元素
-    hPic1 = XPic_Create(656, 225, 290, 315, hWindow);
-    XPic_SetImage(hPic1, XImage_LoadFile(L"ACThumbs.png")); //设置显示图片
-
-    hPic2 = XPic_Create(760, 5, 150, 150, hWindow);
-    XPic_SetImage(hPic2, XImage_LoadFile(L"logo.jpg")); //设置显示图片
-
-//    hPic3 = XPic_Create(654, 416, 128, 128, hWindow);
-//    XPic_SetImage(hPic3, XImage_LoadFile(L"Thumbnail.dat")); //设置显示图片
-
-    //注册列表元素项选择事件
-    XEle_RegisterEvent(hList, XE_LIST_SELECT, MyEventListSelect);
-    XEle_RegisterMessage(hList, XM_MOUSEDBCLICK, MyEventList_MouseDBClick);
-    XEle_RegisterMessage(hList, XM_RBUTTONUP, MyEventList_RButtonUp);
-
-
-    XEle_SetFocus(keyEdit, true);
-}
-
-
-// 事件响应
-
-//bool CALLBACK keyEditChange(HELE hEle, HELE hEventEle)
-//{
-//    return true;
-//}
-
-bool CALLBACK keyBtnClick(HELE hEle, HELE hEventEle)
-{
-    wchar_t keyWord[MAX_PATH] = {0};
-    XEdit_GetText(keyEdit, keyWord, MAX_PATH);
-
-    Everything_SetSearch(keyWord);
-    bool EQRet =  Everything_Query(TRUE);
-    if (EQRet == false) {
-        return false;
-    }
-
-    // 删除所有项目
-    XList_DeleteAllItems(hList);
-
-    const wchar_t* rs = L"(.+)(\\.(?:ai|AI|indd|INDD|Indd|eps|EPS|Eps|pdf|PDF|cdr|CDR|Cdr))";  // 正则字符串,exp开始的单词
-    std::wregex expression(rs);                   // 字符串传递给构造函数,建立正则表达式
-
-    //添加列表项      // Display results.
-    int id = 0;
-    for (int i = 0 ; i < Everything_GetNumResults(); i++) {
-        bool ret = std::regex_match((wchar_t*)Everything_GetResultFileName(i), expression);
-        if (!ret) continue;
-        //添加项
-        XList_AddItem(hList, (wchar_t*)Everything_GetResultFileName(i), 0);
-        //设置子项内容
-        XList_SetItemText(hList, id++, 1, (wchar_t*)Everything_GetResultPath(i), 1);
-//        XList_SetItemText(hList, i, 2, keyWord, 2);
-
-    }
-
-    wchar_t pText[MAX_PATH] = {0};
-    wsprintfW(pText, L"匹配: %d 个文档(AI CDR EPS INDD PDF格式), 鼠标双击: 打开文件,右键: 打开路径", id);
-    XStatic_SetText(hStatic, pText);
-    XWnd_RedrawWnd(hWindow, true);
-    return true;
-
-}
-
-bool CALLBACK pathBtnClick(HELE hEle, HELE hEventEle)
-{
-    char buf[MAX_PATH];
-    if (GetPath(NULL, buf))
-        charToWCHAR(savePath, buf);
-    XEdit_SetText(pathEdit, savePath);
-    return true;
-}
-
-bool CALLBACK runBtnClick(HELE hEle, HELE hEventEle)
-{
-    // 从文本框获得参数
-    edit_text();
-    // // 执行提取缩略图 主功能
-    bool ret = GuiThumbnail(keyFile, savePath);
-    if (ret == false)
-        return ret;
-
-    // 打开文件夹
-    ShellExecuteW(NULL, L"open", savePath, NULL, NULL, SW_SHOW);
-    return ret;
-}
-
-bool CALLBACK closeBtnClick(HELE hEle, HELE hEventEle)
-{
-    // 文本框回写配置
-    edit_text();
-
-    SaveConfigFile();
-    ExitProcess(0); // 退出程序
-    return true;
-}
-
-
-// 选择的文件全名 和路径
-wstring select_filename, select_filepath;
-
-BOOL CALLBACK MyEventListSelect(HELE hEle, HELE hEventEle, int id)
-{
-    if (id < 0)
-        return false;
-    //hEle:列表元素句柄   //id:当前选择项索引
-    select_filename = wstring(XList_GetItemText(hEle,  id, 1)) + L"\\" + XList_GetItemText(hEle,  id, 0);
-    select_filepath = wstring(XList_GetItemText(hEle,  id, 1));
-
-
-    XPic_SetImage(hPic1, XImage_LoadFile(L"")); //设置图片为空,释放图片文件
-
-    wchar_t tmppng[MAX_PATH] = L"Thumbnail.png";
-    bool flag = Thumbnail_TempPng(select_filename.c_str(), tmppng); // 生成新的临时预览图
-
-    if (flag) {
-        XPic_SetImage(hPic1, XImage_LoadFile(tmppng, true)); //设置显示图片
-    }
-
-    XWnd_RedrawWnd(hWindow, true);
-
-    return true;
-}
-
-BOOL CALLBACK MyEventList_RButtonUp(HELE hEle, UINT flags, POINT* pPt)
-{
-    ShellExecuteW(NULL, L"open", select_filepath.c_str(), NULL, NULL, SW_SHOW);
-    return false;
-}
-
-
-BOOL CALLBACK MyEventList_MouseDBClick(HELE hEle, POINT* pPt)
-{
-
-    ShellExecuteW(NULL, L"open", select_filename.c_str(), NULL, NULL, SW_SHOW);
-    return false;
-}
-
-
-// 选择一个目录
-int   GetPath(HWND hWnd, char* pBuffer)
-{
-    BROWSEINFO   bf;
-    LPITEMIDLIST   lpitem;
-    memset(&bf, 0, sizeof(BROWSEINFO));
-    bf.hwndOwner = hWnd;
-    bf.lpszTitle = L"选择路径 ";
-    bf.ulFlags = BIF_RETURNONLYFSDIRS;   //属性你可自己选择
-    lpitem = SHBrowseForFolder(&bf);
-    if (lpitem == NULL)  //如果没有选择路径则返回   0
-        return  0;
-
-    //如果选择了路径则复制路径,返回路径长度
-
-    SHGetPathFromIDListA(lpitem, pBuffer);
-    return   lstrlen(pBuffer);
-}
-
-
-bool Everything_Start(void)
-{
-    Everything_SetSearch(L"Everything.exe");
-    bool EQRet =  Everything_Query(TRUE);
-    if (EQRet == false) {
-      MessageBoxA(NULL, "请先运行Everything软件!\n本软件全盘搜索功能需要Everything SDK.", "Everything SDK", MB_OK);
-      return EQRet;
-    }
-
-//    if (EQRet == false) {
-//
-//        STARTUPINFO si;
-//        PROCESS_INFORMATION pi;
-//        ZeroMemory(&si, sizeof(si));
-//        si.cb = sizeof(si);
-//        // 后台隐藏
-//        si.dwFlags   =   STARTF_USESHOWWINDOW;
-//        si.wShowWindow   =   SW_HIDE;
-//        ZeroMemory(&pi, sizeof(pi));
-//        // Start the child process.
-//        CreateProcess(NULL, "Everything.exe", NULL, NULL, FALSE, 0,
-//                      NULL, NULL, &si, &pi);
-//    }
-
-    return true;
-}

+ 1 - 0
GuiApp/GuiMain.h

@@ -33,6 +33,7 @@ bool CALLBACK pathBtnClick(HELE hEle, HELE hEventEle);
 bool CALLBACK runBtnClick(HELE hEle, HELE hEventEle);
 bool CALLBACK runBtnClick(HELE hEle, HELE hEventEle);
 bool CALLBACK closeBtnClick(HELE hEle, HELE hEventEle);
+bool CALLBACK removeBtnClick(HELE hEle, HELE hEventEle);
 
 BOOL CALLBACK MyEventListSelect(HELE hEle, HELE hEventEle, int id);
 

+ 24 - 2
GuiApp/GuiThumbnail.cpp

@@ -3,7 +3,6 @@
 #include <wchar.h>
 #include <thread>
 
-
 void processFile(const std::wstring& srcFile, const std::wstring& thumbFile)
 {
     // AI EPS INDD 文件导出缩略图
@@ -13,6 +12,13 @@ void processFile(const std::wstring& srcFile, const std::wstring& thumbFile)
         ret = CorelThumbnail_W(srcFile.c_str(), thumbFile.c_str());
 
     // 可以在此处添加处理成功或失败的逻辑
+    if (!ret){
+      char bad_File[MAX_PATH] = "001_Bad_Filelist.txt";
+      FILE * pf =  fopen(bad_File, "a+");
+      WCHARTochar(bad_File, srcFile.c_str());
+      fprintf(pf, "Name: %s\n", bad_File);
+      fclose(pf);
+    }
 }
 
 // 执行提取缩略图 主功能
@@ -22,7 +28,7 @@ bool GuiThumbnail(const wchar_t* keyWord, const wchar_t* savePath)
     wchar_t thumb_filename[MAX_PATH] = {0};
 
     Everything_SetSearch(keyWord);
-    if (false==Everything_Query(TRUE))
+    if (false == Everything_Query(TRUE))
         return false;
 
     std::vector<std::wstring> vec_files;
@@ -54,7 +60,23 @@ bool GuiThumbnail(const wchar_t* keyWord, const wchar_t* savePath)
 //            ret = CorelThumbnail_W(src_filename, thumb_filename);
 //    }
 
+    const int trn = 8;
     std::vector<std::thread> threads;
+
+    while (vec_files.size() > trn) {
+        for (int i = 0; i < trn; i++) {
+            const std::wstring& srcFilename = vec_files[i];
+            const std::wstring& thumbFilename = vec_names[i] + L"_T.jpg";
+            threads.emplace_back(std::thread(processFile, srcFilename, thumbFilename));
+        }
+        // 等待所有线程执行完毕
+        for (auto& trd : threads) trd.join();
+
+        threads.clear();
+        vec_files.erase(vec_files.begin(), vec_files.begin() + trn);
+        vec_names.erase(vec_names.begin(), vec_names.begin() + trn);
+    }
+
     for (int i = 0; i < vec_files.size(); i++) {
         const std::wstring& srcFilename = vec_files[i];
         const std::wstring& thumbFilename = vec_names[i] + L"_T.jpg";