瀏覽代碼

性能优化 - 使用 Block 取代信号量优化

zhudongyong 2 年之前
父節點
當前提交
cc0c9cedda

+ 17 - 2
KdanAutoTest/KdanAuto/Class/AutoTestCase/AutoTest.swift

@@ -9,6 +9,7 @@ import Foundation
 import AppKit
 
 var cacheObjects = NSMutableDictionary()
+let operateQueue = OperationQueue()
 
 class AutoTest : NSObject, AutoTestProtocal {
     var reportString : NSMutableAttributedString? = nil
@@ -20,6 +21,9 @@ class AutoTest : NSObject, AutoTestProtocal {
     var _extention : String = "rtf"
     var _name : String = "对照测试"
     var _params : NSDictionary = [:]
+    var _complention:(AutoTest,NSAttributedString?) -> () = {(obj,rep) in
+        
+    }
     
     class func autoTestFor(_ fileType:NSString ,type:NSString) -> AutoTest? {
         let key = String(fileType) + "." + String(type)
@@ -135,6 +139,17 @@ class AutoTest : NSObject, AutoTestProtocal {
     
     
     // Auto Test
+    func autoTest(_ complention:@escaping (_ object:AutoTest, _ report:NSAttributedString?) -> ()) {
+        self._complention = complention
+        DispatchQueue.global().async {
+            self.autoTest()
+            
+            DispatchQueue.main.async {
+                self._complention(self, nil)
+            }
+        }
+    }
+    
     func autoTest() {
         clearCacheFiles()
         
@@ -333,13 +348,13 @@ class AutoTest : NSObject, AutoTestProtocal {
         let convertSemaphore = DispatchSemaphore(value: 0)
         var status = Int(1)
         let convertQueue = DispatchQueue.global()
-        convertQueue.async {
+        operateQueue.addOperation {
             autoreleasepool {
                 status = FileConverter.shared().converter(originPath, inDesPath: resultPath, params: params)
                 
                 // 修复转 PNG 实际图片为 JPG 问题, 导致无法匹配问题
                 if (NSArray(array: ["png", "PNG"]).contains(NSString(string: resultPath).pathExtension)) {
-                    let items = FileManager.default.subpaths(atPath: resultPath)! as [String]
+                    let items = (FileManager.default.subpaths(atPath: resultPath) ?? []) as [String]
                     for item in items {
                         if NSArray(array: ["jpg", "JPG"]).contains(NSString(string:item).pathExtension) {
                             let path = NSString(string: resultPath).appendingPathComponent(item);

+ 1 - 1
KdanAutoTest/KdanAuto/Class/AutoTestCase/AutoTestProtocal.swift

@@ -34,8 +34,8 @@ protocol AutoTestProtocal : NSObjectProtocol {
     // 是否勾选了快照测试
     func needCompareTest() -> Bool
     
-    
     func autoTest()
+    func autoTest(_ complention:@escaping (_ object:AutoTest, _ report:NSAttributedString?) -> ())
     
     func testReport() -> NSAttributedString?
 //    func testReportOfFile(_ fileName:String) -> NSAttributedString?

+ 2 - 2
KdanAutoTest/KdanAuto/Class/CompareViewController/CompareViewController.swift

@@ -165,7 +165,7 @@ class CompareViewController: NSViewController, NSTableViewDataSource, NSTableVie
     
     
     // Show
-    func showIn(_ view:NSView?, rect:NSRect) {
+    func showIn(_ view:NSView, rect:NSRect) {
         if _popover == nil {
             _popover = NSPopover.init()
             _popover.contentViewController = self;
@@ -173,7 +173,7 @@ class CompareViewController: NSViewController, NSTableViewDataSource, NSTableVie
         }
         _popover.contentSize = self.view.frame.size
         
-        _popover.show(relativeTo: rect, of: view!, preferredEdge: NSRectEdge.minX)
+        _popover.show(relativeTo: rect, of: view, preferredEdge: NSRectEdge.minY)
     }
     
     

+ 1 - 1
KdanAutoTest/KdanAuto/Class/CompareViewController/CompareViewController.xib

@@ -117,7 +117,7 @@
                         <action selector="filterSimilarItemAction:" target="YBj-nQ-WgX" id="RbW-XC-vmp"/>
                     </connections>
                 </button>
-                <progressIndicator hidden="YES" fixedFrame="YES" maxValue="100" doubleValue="50" style="bar" id="865-rk-Lp5">
+                <progressIndicator hidden="YES" maxValue="100" doubleValue="50" style="bar" id="865-rk-Lp5">
                     <rect key="frame" x="709" y="925" width="100" height="20"/>
                     <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                 </progressIndicator>

+ 0 - 1
KdanAutoTest/KdanAuto/Class/Norrmal/ActivityView/ActivityView.swift

@@ -164,7 +164,6 @@ class ActivityView : NSView {
 //                                          userInfo: nil, repeats: true)
         }
         case .Finished: do {
-            NSLog("_degree=\(_degree)")
             _titleLbl.stringValue = NSString(format: "完成 %.0f%%", _degree) as String
             
             if fabs(_degree-100)>=0.1 {

+ 2 - 2
KdanAutoTest/KdanAuto/Class/Norrmal/Cell/TestCaseCellView.swift

@@ -180,8 +180,8 @@ class TestCaseCellView : NSTableCellView {
             compareVC.setFiles(files)
             
             let point = sender.convert(CGPoint(x: 0, y: 0),
-                                       to: self.window?.contentView)
-            compareVC.showIn(self.window?.contentView, rect: NSRect.init(origin: point, size: sender.frame.size))
+                                       to: self.window?.contentView ?? self)
+            compareVC.showIn(self.window?.contentView ?? self, rect: NSRect.init(origin: point, size: sender.frame.size))
         }
         return
         

+ 86 - 105
KdanAutoTest/KdanAuto/Class/Tools/FileConveter/FileConverter.swift

@@ -29,7 +29,6 @@ class FileConverter : NSObject, CPDFConverterDelegate, CPDFConverterFPDelegate {
     var pages:[Int] = []
     var pathExtension = ""
     var convertQueue = DispatchQueue.main
-    var operateQueue = OperationQueue()
     
     var semaphore:DispatchSemaphore? = DispatchSemaphore.init(value: 0)
     var accessSemaphore:DispatchSemaphore? = DispatchSemaphore.init(value: 1)
@@ -96,8 +95,8 @@ class FileConverter : NSObject, CPDFConverterDelegate, CPDFConverterFPDelegate {
             let url = URL.init(fileURLWithPath: self.srcPath, isDirectory: false)
             let document = PDFDocument(url: url)
             if document == nil {
-                self.accessSemaphore?.signal()
                 self.didSuccess = -2;
+                self.accessSemaphore?.signal()
                 return
             }
             let pageCount = document!.pageCount
@@ -108,8 +107,7 @@ class FileConverter : NSObject, CPDFConverterDelegate, CPDFConverterFPDelegate {
             }
             
             if  !useOldLib && NSArray(array: ["jpg", "JPG", "png", "PNG"]).contains(self.pathExtension) {
-                self.operateQueue.addOperation {
-                    autoreleasepool {
+                autoreleasepool {
                         let cachePath = NSString(string: self.desPath).deletingPathExtension+".zip"
                         self.pdfConverter = CPDFConverterImg.init(url: url, password: nil)
                         if (nil == self.pdfConverter && nil != password) {
@@ -124,128 +122,111 @@ class FileConverter : NSObject, CPDFConverterDelegate, CPDFConverterFPDelegate {
                         }
                         self.pdfConverter?.convert(toFilePath: cachePath, pageIndexs: self.pages, options: self.options)
                     }
-                }
             }else if !useOldLib && NSArray(array: ["ppt", "PPT", "PPTX", "pptx"]).contains(self.pathExtension) {
-                self.operateQueue.addOperation {
-                    autoreleasepool {
-                        self.pdfConverter = CPDFConverterPPT.init(url: url, password: nil)
-                        if (nil == self.pdfConverter && nil != password) {
-                            self.pdfConverter = CPDFConverterPPT.init(url: url, password: password as? String)
-                        }
-                        self.pdfConverter?.delegate = self
-                        self.options = CPDFConvertPPTOptions()
-                        self.pdfConverter?.convert(toFilePath: self.desPath,
-                                                   pageIndexs: self.pages, options: self.options)
+                autoreleasepool {
+                    self.pdfConverter = CPDFConverterPPT.init(url: url, password: nil)
+                    if (nil == self.pdfConverter && nil != password) {
+                        self.pdfConverter = CPDFConverterPPT.init(url: url, password: password as? String)
                     }
+                    self.pdfConverter?.delegate = self
+                    self.options = CPDFConvertPPTOptions()
+                    self.pdfConverter?.convert(toFilePath: self.desPath,
+                                               pageIndexs: self.pages, options: self.options)
                 }
             }else if !useOldLib && NSArray(array: ["doc", "DOC", "docx", "DOCX"]).contains(self.pathExtension) {
-                self.operateQueue.addOperation {
-                    autoreleasepool {
-                        self.pdfConverter = CPDFConverterWord.init(url: url, password: nil)
-                        if (nil == self.pdfConverter && nil != password) {
-                            self.pdfConverter = CPDFConverterWord.init(url: url, password: password as? String)
-                        }
-                        self.pdfConverter?.delegate = self
-                        self.options = CPDFConvertWordOptions()
-                        self.pdfConverter?.convert(toFilePath: self.desPath,
-                                                   pageIndexs: self.pages, options: self.options)
+                autoreleasepool {
+                    self.pdfConverter = CPDFConverterWord.init(url: url, password: nil)
+                    if (nil == self.pdfConverter && nil != password) {
+                        self.pdfConverter = CPDFConverterWord.init(url: url, password: password as? String)
                     }
+                    self.pdfConverter?.delegate = self
+                    self.options = CPDFConvertWordOptions()
+                    self.pdfConverter?.convert(toFilePath: self.desPath,
+                                               pageIndexs: self.pages, options: self.options)
                 }
             }else if !useOldLib && NSArray(array: ["xls", "XLS", "xlsx", "XLSX"]).contains(self.pathExtension) {
-                self.operateQueue.addOperation {
-                    autoreleasepool {
-                        self.pdfConverter = CPDFConverterExcel.init(url: url, password: nil)
-                        if (nil == self.pdfConverter && nil != password) {
-                            self.pdfConverter = CPDFConverterExcel.init(url: url, password: password as? String)
-                        }
-                        self.pdfConverter?.delegate = self
-                        self.options = CPDFConvertExcelOptions()
-                        self.pdfConverter?.convert(toFilePath: self.desPath,
-                                                                  pageIndexs: self.pages, options: self.options)
+                autoreleasepool {
+                    self.pdfConverter = CPDFConverterExcel.init(url: url, password: nil)
+                    if (nil == self.pdfConverter && nil != password) {
+                        self.pdfConverter = CPDFConverterExcel.init(url: url, password: password as? String)
                     }
+                    self.pdfConverter?.delegate = self
+                    self.options = CPDFConvertExcelOptions()
+                    self.pdfConverter?.convert(toFilePath: self.desPath,
+                                               pageIndexs: self.pages, options: self.options)
                 }
             }else if !useOldLib && NSArray(array: ["csv", "CSV"]).contains(self.pathExtension) {
-                self.operateQueue.addOperation {
-                    autoreleasepool {
-                        self.pdfConverter = CPDFConverterCsv.init(url: url, password: nil)
-                        if (nil == self.pdfConverter && nil != password) {
-                            self.pdfConverter = CPDFConverterCsv.init(url: url, password: password as? String)
-                        }
-                        self.pdfConverter?.delegate = self
-                        self.options = CPDFConvertCsvOptions()
-                        self.pdfConverter?.convert(toFilePath: self.desPath,
-                                                                  pageIndexs: self.pages, options: self.options)
+                autoreleasepool {
+                    self.pdfConverter = CPDFConverterCsv.init(url: url, password: nil)
+                    if (nil == self.pdfConverter && nil != password) {
+                        self.pdfConverter = CPDFConverterCsv.init(url: url, password: password as? String)
                     }
+                    self.pdfConverter?.delegate = self
+                    self.options = CPDFConvertCsvOptions()
+                    self.pdfConverter?.convert(toFilePath: self.desPath,
+                                               pageIndexs: self.pages, options: self.options)
                 }
             }else if !useOldLib && NSArray(array: ["html", "HTML"]).contains(self.pathExtension) {
-                self.operateQueue.addOperation {
-                    autoreleasepool {
-                        let cachePath = NSString(string: self.desPath).deletingPathExtension+".zip"
-                        self.pdfConverter = CPDFConverterHtml.init(url: url, password: nil)
-                        if (nil == self.pdfConverter && nil != password) {
-                            self.pdfConverter = CPDFConverterHtml.init(url: url, password: password as? String)
-                        }
-                        self.pdfConverter?.delegate = self
-                        self.options = CPDFConvertHtmlOptions()
-                        if ((tParams.value(forKey: "paneOptions") as? NSNumber) != nil) {
-                            (self.options as! CPDFConvertHtmlOptions).paneOptions = CPDFConvertHtmlPageAndNavigationPaneOptions(rawValue: (tParams.value(forKey: "paneOptions") as! NSNumber).intValue)!
-                        }
-                        self.pdfConverter?.convert(toFilePath: cachePath,
-                                                                  pageIndexs: self.pages, options: self.options)
+                autoreleasepool {
+                    let cachePath = NSString(string: self.desPath).deletingPathExtension+".zip"
+                    self.pdfConverter = CPDFConverterHtml.init(url: url, password: nil)
+                    if (nil == self.pdfConverter && nil != password) {
+                        self.pdfConverter = CPDFConverterHtml.init(url: url, password: password as? String)
+                    }
+                    self.pdfConverter?.delegate = self
+                    self.options = CPDFConvertHtmlOptions()
+                    if ((tParams.value(forKey: "paneOptions") as? NSNumber) != nil) {
+                        (self.options as! CPDFConvertHtmlOptions).paneOptions = CPDFConvertHtmlPageAndNavigationPaneOptions(rawValue: (tParams.value(forKey: "paneOptions") as! NSNumber).intValue)!
                     }
+                    self.pdfConverter?.convert(toFilePath: cachePath,
+                                               pageIndexs: self.pages, options: self.options)
                 }
             }else if !useOldLib && NSArray(array: ["rtf", "RTF"]).contains(self.pathExtension) {
-                self.operateQueue.addOperation {
-                    autoreleasepool {
-                        self.pdfConverter = CPDFConverterRtf.init(url: url, password: nil)
-                        if (nil == self.pdfConverter && nil != password) {
-                            self.pdfConverter = CPDFConverterRtf.init(url: url, password: password as? String)
-                        }
-                        self.pdfConverter?.delegate = self
-                        self.options = CPDFConvertRtfOptions()
-                        self.pdfConverter?.convert(toFilePath: self.desPath,
-                                                                  pageIndexs: self.pages, options: self.options)
-                   }
+                autoreleasepool {
+                    self.pdfConverter = CPDFConverterRtf.init(url: url, password: nil)
+                    if (nil == self.pdfConverter && nil != password) {
+                        self.pdfConverter = CPDFConverterRtf.init(url: url, password: password as? String)
+                    }
+                    self.pdfConverter?.delegate = self
+                    self.options = CPDFConvertRtfOptions()
+                    self.pdfConverter?.convert(toFilePath: self.desPath,
+                                               pageIndexs: self.pages, options: self.options)
                 }
             }else if !useOldLib && NSArray(array: ["txt", "TXT"]).contains(self.pathExtension) {
-                self.operateQueue.addOperation {
-                    autoreleasepool {
-                        self.pdfConverter = CPDFConverterTxt.init(url: url, password: nil)
-                        if (nil == self.pdfConverter && nil != password) {
-                            self.pdfConverter = CPDFConverterTxt.init(url: url, password: password as? String)
-                        }
-                        self.pdfConverter?.delegate = self
-                        self.options = CPDFConvertTxtOptions()
-                        self.pdfConverter?.convert(toFilePath: self.desPath,
-                                                                  pageIndexs: self.pages, options: self.options)
+                autoreleasepool {
+                    self.pdfConverter = CPDFConverterTxt.init(url: url, password: nil)
+                    if (nil == self.pdfConverter && nil != password) {
+                        self.pdfConverter = CPDFConverterTxt.init(url: url, password: password as? String)
                     }
+                    self.pdfConverter?.delegate = self
+                    self.options = CPDFConvertTxtOptions()
+                    self.pdfConverter?.convert(toFilePath: self.desPath,
+                                               pageIndexs: self.pages, options: self.options)
                 }
             }else {
-                self.operateQueue.addOperation {
-                    autoreleasepool {
-                        if self.fpConverter == nil {
-                            self.fpConverter = CPDFConverterFP.init()
-                            self.fpConverter?.setDelegate(self)
-                        }else {
-                            self.fpConverter?.stopConvertsionIfNeed()
-                        }
-                        
-                        var needMerge = NSArray(array: ["csv", "CSV"]).contains(self.pathExtension)
-                        let dpi = tParams.value(forKey: "KMPDFConvertOptionsKeyImageDPI")
-                        if (needMerge && tParams.value(forKey: "CPDFConvertOptionsKeyAllInOneSheet") != nil) {
-                            needMerge = (tParams.value(forKey: "CPDFConvertOptionsKeyAllInOneSheet") as! NSNumber).boolValue
-                        }
-                        
-                        self.fpConverter?.convertPDF(atPath: self.srcPath,
-                                                     pdfPassword: password as? String,
-                                                     pdfPageIndexs: self.pages,
-                                                     destDocType: self.pathExtension,
-                                                     destDocPath: self.desPath,
-                                                     moreOptions: [
-                                                        "KMPDFConvertOptionsKeyImageDPI" : (dpi as? String) ?? "72",
-                                                        "CPDFConvertOptionsKeyAllInOneSheet":NSNumber(booleanLiteral: needMerge)
-                                                     ])
-                   }
+                autoreleasepool {
+                    if self.fpConverter == nil {
+                        self.fpConverter = CPDFConverterFP.init()
+                        self.fpConverter?.setDelegate(self)
+                    }else {
+                        self.fpConverter?.stopConvertsionIfNeed()
+                    }
+                    
+                    var needMerge = NSArray(array: ["csv", "CSV"]).contains(self.pathExtension)
+                    let dpi = tParams.value(forKey: "KMPDFConvertOptionsKeyImageDPI")
+                    if (needMerge && tParams.value(forKey: "CPDFConvertOptionsKeyAllInOneSheet") != nil) {
+                        needMerge = (tParams.value(forKey: "CPDFConvertOptionsKeyAllInOneSheet") as! NSNumber).boolValue
+                    }
+                    
+                    self.fpConverter?.convertPDF(atPath: self.srcPath,
+                                                 pdfPassword: password as? String,
+                                                 pdfPageIndexs: self.pages,
+                                                 destDocType: self.pathExtension,
+                                                 destDocPath: self.desPath,
+                                                 moreOptions: [
+                                                    "KMPDFConvertOptionsKeyImageDPI" : (dpi as? String) ?? "72",
+                                                    "CPDFConvertOptionsKeyAllInOneSheet":NSNumber(booleanLiteral: needMerge)
+                                                 ])
                 }
             }
         }

+ 57 - 69
KdanAutoTest/KdanAuto/ViewController.swift

@@ -24,6 +24,7 @@ class ViewController : NSViewController, SettingViewControllerDelegate, AutoTest
     @IBOutlet var exportReportBtn : NSButton!
     @IBOutlet var advanceBtn : NSButton!
     
+    var operateQueue = OperationQueue()
     var _isProcessing : Bool!
     
     var _selectFileType : String! = ""
@@ -136,8 +137,7 @@ class ViewController : NSViewController, SettingViewControllerDelegate, AutoTest
             DataModel.shared.generaNewReportID()
             TestDegreeManager.shared().clearAllHistory()
             
-            let testSemaphore = DispatchSemaphore(value: 0)
-            
+            let objects = NSMutableArray()
             // Update For Waiting
             for fileType in testFileTypes {
                 let types = testTypeInfo[fileType] as! NSArray
@@ -146,85 +146,73 @@ class ViewController : NSViewController, SettingViewControllerDelegate, AutoTest
                     let type = ti["Type"] as! NSString
                     
                     let testObject = AutoTest.autoTestFor(fileType as NSString, type: type)
+                    if (testObject != nil) {
+                        objects.add(testObject);
+                    }
                     testObject?.setStatus(.Wait)
                 }
                 DispatchQueue.main.sync {
                     self.reloadListData()
                 }
             }
-            
-            for fileType in testFileTypes {
-                let types = testTypeInfo[fileType] as! NSArray
-                for typeInfo in types {
-                    let ti = typeInfo as! NSDictionary
-                    let type = ti["Type"] as! NSString
+            var autotestBlock:(NSMutableArray, Int) -> () = { (objects:NSMutableArray, index:Int) in
+                
+            }
+            autotestBlock = { (objects:NSMutableArray, index:Int) in
+                NSLog("Auto Test \(index)")
+                if (index >= objects.count) {
+                    do {
+                        let rtfData = try report.data(from: .init(location: 0, length: report.length),
+                                                      documentAttributes: [.documentType: NSAttributedString.DocumentType.rtf])
+                        
+                        let path = DataModel.shared.directoryPath().appendingFormat("/TestReport_\(DataModel.shared.latestReportID()!).rtf")
+                        try rtfData.write(to: NSURL.fileURL(withPath: path))
+                    } catch {
+                        print(error)
+                    }
                     
-                    let testObject = AutoTest.autoTestFor(fileType as NSString, type: type)
-                    testObject?.setStatus(.Process)
-                    DispatchQueue.main.sync {
-                        self.reloadListData()
+                    DispatchQueue.main.async {
+                        self._isProcessing = false
+                        self.updateProcessStatus()
+                        self.startBtn.isEnabled = true
+                        self.startBtn.title = "Start"
+                        
+                        self.replaceAllBtn.isEnabled = true
+                        self.exportReportBtn.isEnabled = true;
+                        self.advanceBtn.isEnabled = true;
+                        
+                        TestDegreeManager.shared().saveInfo()
                     }
-                    if nil != testObject {
-                        autoreleasepool {
-                            let queue = DispatchQueue.global()
-                            queue.async {
-                                testObject?.autoTest()
-                                
-                                testSemaphore.signal()
-                            }
-                            testSemaphore.wait()
-                            
-                            if let cReport = testObject?.testReport() {
-                                report.append(cReport)
-                            }
-                        }
+                    return
+                }
+                
+                let testobject = objects.object(at: index) as! AutoTest
+                testobject.setStatus(.Process)
+                
+                testobject.autoTest {(object, inReport) in
+                    if inReport != nil {
+                        report.append(inReport!)
                     }
-                    if (testObject != nil && testObject!.needCompareTest()) {
-                        testObject?.setStatus(.Finished)
+                    
+                    if (object.needCompareTest()) {
+                        object.setStatus(.Finished)
                     }else {
-                        testObject?.setStatus(.Normal)
+                        object.setStatus(.Normal)
                     }
-                    DispatchQueue.main.sync {
-                        self.reloadListData()
-                        
-                        if (self.advanceView.getAutoTestObj() != nil && testObject != nil &&
-                            testObject!.isEqual(to: self.advanceView.getAutoTestObj())) {
-                            self.advanceView.setAutoTestObj(self.advanceView.getAutoTestObj());
-                        }
+                    
+                    self.reloadListData()
+                    
+                    if (self.advanceView.getAutoTestObj() != nil  &&
+                        object.isEqual(to: self.advanceView.getAutoTestObj())) {
+                        self.advanceView.setAutoTestObj(self.advanceView.getAutoTestObj());
                     }
+                    
+                    autotestBlock(objects, index+1)
+                    
+                    return
                 }
-                
-//                for typeInfo in types {
-//                    let ti = typeInfo as! NSDictionary
-//                    let type = ti["Type"] as! NSString
-//                    
-//                    let testObject = AutoTest.autoTestFor(fileType as NSString, type: type)
-//                    testObject?.setStatus(.Normal)
-//                }
-            }
-
-            do {
-                let rtfData = try report.data(from: .init(location: 0, length: report.length),
-                                                 documentAttributes: [.documentType: NSAttributedString.DocumentType.rtf])
-
-                let path = DataModel.shared.directoryPath().appendingFormat("/TestReport_\(DataModel.shared.latestReportID()!).rtf")
-                try rtfData.write(to: NSURL.fileURL(withPath: path))
-            } catch {
-                print(error)
-            }
-            
-            DispatchQueue.main.async {
-                self._isProcessing = false
-                self.updateProcessStatus()
-                self.startBtn.isEnabled = true
-                self.startBtn.title = "Start"
-                
-                self.replaceAllBtn.isEnabled = true
-                self.exportReportBtn.isEnabled = true;
-                self.advanceBtn.isEnabled = true;
-                
-                TestDegreeManager.shared().saveInfo()
             }
+            autotestBlock(objects, 0)
         }
     }
     
@@ -312,8 +300,8 @@ class ViewController : NSViewController, SettingViewControllerDelegate, AutoTest
             let compareVC = CompareViewController.shared()
             compareVC.setFiles(files)
             
-            let point = sender.convert(CGPoint(x: 0, y: 0), to: self.view.window?.contentView)
-            compareVC.showIn(self.view.window?.contentView, rect: NSRect.init(origin: point, size: sender.frame.size))
+            let point = sender.convert(CGPoint(x: 0, y: 0), to: self.view.window?.contentView ?? self.view)
+            compareVC.showIn(self.view.window?.contentView ?? self.view, rect: NSRect.init(origin: point, size: sender.frame.size))
         }
         return
         

+ 69 - 0
KdanAutoTest/ProcessCheckFile/Process/ProcessThumbnal.swift

@@ -17,6 +17,75 @@ let generator = QLThumbnailGenerator.shared
 
 class ProcessThumbnal : NSObject {
     
+    // 异步方法
+    class func process(_ filePath:String, desPath:String, complention:@escaping (_ success:Bool) -> ()) {
+        let kDefaultThumbnailSize = CGSizeMake(1000.0, 1000.0)
+        return process(filePath, desPath: desPath, outputSize: kDefaultThumbnailSize, complention: complention)
+    }
+    
+    class func process(_ filePath:String, desPath:String, outputSize:CGSize, complention:@escaping (_ success:Bool) -> ()) {
+        if NSArray(array: ["PDF", "pdf"]).contains(NSString(string: filePath).pathExtension) {
+            return autoreleasepool {
+                let status = FileConverter.shared().converter(filePath, inDesPath: desPath)
+                complention(status == 1)
+            }
+        }
+        
+        if NSArray(array: ["JPG", "jpg"]).contains(NSString(string: filePath).pathExtension) {
+            complention(true)
+        }
+        
+        if NSArray(array: ["bmp", "BMP", "PNG", "png", "JPG", "jpg"]).contains(NSString(string: filePath).pathExtension) {
+            complention(autoreleasepool {
+                let imageSource = CGImageSourceCreateWithURL(URL.init(fileURLWithPath: filePath, isDirectory: false) as CFURL, nil)
+                
+                if nil == imageSource {
+                    return false
+                }
+                
+                // Get the BMP image
+                let cgimage = CGImageSourceCreateImageAtIndex(imageSource!, 0, nil)
+                if nil == cgimage {
+                    return false
+                }
+                
+                let rep = NSBitmapImageRep.init(cgImage: cgimage!)
+                let data = rep.representation(using: NSBitmapImageRep.FileType.png, properties: [:]);
+                
+                let url = URL.init(fileURLWithPath: desPath, isDirectory: false)
+                try? data!.write(to: url)
+                
+                return true
+            })
+        }
+        
+        var didFinished = false
+        
+        let url = URL.init(fileURLWithPath: filePath, isDirectory: false)
+        generator.generateRepresentations(for: QLThumbnailGenerator.Request.init(fileAt: url, size: outputSize, scale: 2.0, representationTypes: QLThumbnailGenerator.Request.RepresentationTypes.thumbnail),
+                                          
+                                          update: { (representation, type, error) in
+            if nil != representation {
+                autoreleasepool {
+                    let image = representation!.nsImage as NSImage
+                    
+                    if nil != image {
+                        didFinished = true
+                        
+                        let rep = NSBitmapImageRep.init(cgImage: image.cgImage(forProposedRect: nil, context: nil, hints: nil)!)
+                        let data = rep.representation(using: NSBitmapImageRep.FileType.png, properties: [:]);
+                        
+                        let url = URL.init(fileURLWithPath: desPath, isDirectory: false)
+                        try? data!.write(to: url)
+                    }
+                }
+            }
+            
+            complention(didFinished)
+        })
+    }
+    
+    //同步方法
     class func process(_ filePath:String, desPath:String) -> Bool {
         let kDefaultThumbnailSize = CGSizeMake(1000.0, 1000.0)