Browse Source

更改阻塞线程的方式

Kevin 6 years ago
parent
commit
36f46dc014

File diff suppressed because it is too large
+ 2 - 0
GetEasy.Node.Printer.Test/Form1.cs


+ 29 - 33
GetEasy.Node.Printer/NodeReportDesigner.cs

@@ -29,6 +29,10 @@ namespace GetEasy.Node.Printer
 {
     public class NodeReportDesigner
     {
+        private static ManualResetEvent _nodeThread;
+        private static ManualResetEvent _formThread;
+        private static SaveObj _saveObj;
+
         ///// <summary>
         /////  保存回调方法,防止被GC
         ///// </summary>
@@ -36,7 +40,7 @@ namespace GetEasy.Node.Printer
         static NodeReportDesigner()
         {
         }
-        
+
         [UnmanagedFunctionPointer(CallingConvention.Winapi)]
         public delegate void SaveCallback([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]String template, SaveResultCallback resultCallback);
         [UnmanagedFunctionPointer(CallingConvention.Winapi)]
@@ -46,12 +50,12 @@ namespace GetEasy.Node.Printer
 
         [DllExport(CallingConvention = CallingConvention.Winapi, ExportName = "designerReport")]
         public static void DesignerReport([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]String template,
-            [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]String templateData, SaveCallback saveCallback)
+            [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]String templateData)
         {
-            ManualResetEvent manualResetEvent = new ManualResetEvent(false);
-            ManualResetEvent formManualResetEvent = new ManualResetEvent(true);
+            _nodeThread = new ManualResetEvent(true);
+            _formThread = new ManualResetEvent(true);
+            _saveObj = new SaveObj();
 
-            SaveObj obj = new SaveObj();
 
             var thread = new Thread(() =>
             {
@@ -73,10 +77,11 @@ namespace GetEasy.Node.Printer
                     if (!String.IsNullOrEmpty(templateData))
                     {
                         JsonDataSource dataSource = null;
-                        if(report.DataSource != null && report.DataSource is JsonDataSource)
+                        if (report.DataSource != null && report.DataSource is JsonDataSource)
                         {
                             dataSource = report.DataSource as JsonDataSource;
-                        }else
+                        }
+                        else
                         {
                             dataSource = new JsonDataSource();
                         }
@@ -89,13 +94,13 @@ namespace GetEasy.Node.Printer
                     {
                         MemoryStream stream = new MemoryStream();
                         designPanel.Report.SaveLayoutToXml(stream);
-                        obj.SaveData = Encoding.UTF8.GetString(stream.ToArray());
+                        _saveObj.SaveData = Encoding.UTF8.GetString(stream.ToArray());
 
-                        formManualResetEvent.Reset(); // 切换回主线程保存数据
-                        manualResetEvent.Set();
-                        formManualResetEvent.WaitOne();
+                        _formThread.Reset(); // 切换回主线程保存数据
+                        _nodeThread.Set();
+                        _formThread.WaitOne();
 
-                        if (!obj.IsSaveSuccess)
+                        if (!_saveObj.IsSaveSuccess)
                         {
                             MessageBox.Show("保存失败!", "提示");
                         }
@@ -114,36 +119,27 @@ namespace GetEasy.Node.Printer
                 {
                     Console.WriteLine(ex.Message);
                 }
-                obj.SaveData = null; // 清空保存数据并且启动主线程
-                manualResetEvent.Set();
+                _saveObj.SaveData = null; // 清空保存数据并且启动主线程
+                _nodeThread.Set();
             });
             thread.SetApartmentState(ApartmentState.STA);
             thread.Start();
-            WaitSaveOrClose(saveCallback, manualResetEvent, formManualResetEvent, obj);
         }
 
-        private static void WaitSaveOrClose(SaveCallback saveCallback, ManualResetEvent manualResetEvent, ManualResetEvent formManualResetEvent, SaveObj obj)
+        [DllExport(CallingConvention = CallingConvention.Winapi, ExportName = "waitSaveOrClose")]
+        public static void WaitSaveOrClose(SaveCallback saveCallback)
         {
             //RibbonControllerBase data;
-            while(manualResetEvent.WaitOne())
+            _nodeThread.Reset();
+            _nodeThread.WaitOne();
+
+            saveCallback(_saveObj.SaveData, (result) =>
             {
-                //Guid resultKey = Guid.NewGuid();
-                //SaveResultCallback resultCallback = (result) =>
-                //{
-                //    obj.IsSaveSuccess = result;
-
-                //    //WaitSaveOrClose(saveCallback, manualResetEvent, formManualResetEvent, obj);
-                //    //dicResult.Remove(resultKey); // 删除回调,让系统GC
-                //};
-                //dicResult[resultKey] = resultCallback;
-                saveCallback(obj.SaveData, (result)=> {
-                    obj.IsSaveSuccess = result;
-                });
-                formManualResetEvent.Set(); // 重新等待设计窗口信息
-                manualResetEvent.Reset();
-            }
+                _saveObj.IsSaveSuccess = result;
+                _formThread.Set(); // 重新等待设计窗口信息
+            });
         }
-        
+
         [DllExport(CallingConvention = CallingConvention.Winapi, ExportName = "reportShowPreview")]
         public static void ReportShowPreview([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]String fileName, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]String jsonData)
         {

BIN
GetEasy.Node.Printer/dll/GetEasy.Node.Printer.64.dll


BIN
GetEasy.Node.Printer/dll/GetEasy.Node.Printer.86.dll


BIN
GetEasy.Node.Printer/dll/GetEasy.Node.Printer.dll


+ 21 - 17
GetEasy.Node.Printer/index.ts

@@ -23,9 +23,10 @@ if (!fs.existsSync(dllPath)) {
 }
 let callbackPointer: Buffer;
 const dll = ffi.Library(dllPath, {
-    designerReport: ['void', ['string', 'string', 'pointer']],
+    designerReport: ['void', ['string', 'string']],
     reportShowPreview: ['void', ['string', 'string']],
-    reportPrinter: ['void', ['string', 'string']]
+    reportPrinter: ['void', ['string', 'string']],
+    waitSaveOrClose: ['void', ['pointer']]
 });
 type SaveCallback = (saveTemplate: string, callback: (result: boolean) => void) => void;
 export default class ReportApi {
@@ -39,24 +40,27 @@ export default class ReportApi {
      */
     static designerReport(template: string, tempData: string, saveCallback: SaveCallback): void {
         callbackPointer = ffi.Callback('void', ['string', 'pointer'], (data: string, func) => {
-            let nativeCallback = ffi.ForeignFunction(func, 'void', ['bool']);
-            try {
+            if (data) {
+                let nativeCallback = ffi.ForeignFunction(func, 'void', ['bool']);
+                try {
 
-                saveCallback(data, (result) => {
-                    if (result) {
-                        nativeCallback(true);
-                    } else {
-                        nativeCallback(false);
-                    }
-
-                });
-            } catch (e) {
-                console.error(e);
-                nativeCallback(false);
+                    saveCallback(data, (result) => {
+                        if (result) {
+                            nativeCallback(true);
+                        } else {
+                            nativeCallback(false);
+                        }
+                        dll.waitSaveOrClose(callbackPointer);
+                    });
+                } catch (e) {
+                    console.error(e);
+                    nativeCallback(false);
+                    dll.waitSaveOrClose(callbackPointer);
+                }
             }
         });
-        dll.designerReport(template, tempData, callbackPointer);
-
+        dll.designerReport(template, tempData);
+        dll.waitSaveOrClose(callbackPointer);
     }
     /**
      *打印预览

+ 1 - 1
GetEasy.Node.Printer/package.json

@@ -1,6 +1,6 @@
 {
   "name": "geteasy.node.printer",
-  "version": "1.0.8",
+  "version": "1.0.9",
   "description": "",
   "main": "index.js",
   "scripts": {

Some files were not shown because too many files changed in this diff