乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 143|回复: 5

运行AutoCAD Core控制台

[复制链接]

26

主题

128

帖子

2

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
231
发表于 2021-4-21 08:03:39 | 显示全部楼层 |阅读模式
先生们,
我找到了一种方法,可以在窗口不可见的情况下运行AutoCAD Core控制台,将secureload设置为0,然后Netload一个dll,运行一个带有参数、GUID字符串的.NET Lisp应用程序。此字符串是进程间通信的管道名称。这允许外部应用程序优雅地处理DWG
与AutoCAD相比,AutoCAD Core控制台本身使用的RAM非常少。当它空闲时,它使用0%的CPU功率。我遇到的问题是,我的应用程序占用了大量CPU资源。我的英特尔I9 CPU有10个内核,20个线程。它100%使用一个线程,占整个CPU的5%。当程序处于空闲状态时,我想将其减少到~0.1%
以下是我在AutoCAD Core控制台中运行的代码
  1. using AcConsole;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Clifton.Core.Pipes;
  5. using NetDBX;
  6. using System.Collections.Generic;
  7. using System.IO;
  8. namespace AcConsoleIn
  9. {
  10.     ///
  11.     /// Provides static methods to run within AutoCAD Core Console
  12.     ///
  13.     public static class Run
  14.     {
  15.         // IPC Pipe
  16.         private static ClientPipe Client { get; set; }
  17.         ///
  18.         /// Provides the Lisp Function to connect this process to an external application.
  19.         ///
  20.         ///
  21.         [LispFunction("PROCESS")]
  22.         public static void Process(ResultBuffer buffer)
  23.         {
  24.             try
  25.             {
  26.                 using (buffer)
  27.                 {
  28.                     // Process input
  29.                     List args = AutoLisp.HandleLispArguments(buffer, 1, 1);
  30.                     // Create and connect IPC pipe
  31.                     string pipeName = AutoLisp.LispToString(args[0]);
  32.                     Client = new ClientPipe(".", pipeName, p => p.StartStringReaderAsync());
  33.                     Client.DataReceived += Client_DataReceived;
  34.                     Client.Connect();
  35.                 }
  36.             }
  37.             catch { }
  38.         }
  39.         ///
  40.         /// Event Handler for processing data from server.
  41.         ///
  42.         ///
  43.         ///
  44.         private static void Client_DataReceived(object sender, PipeEventArgs e)
  45.         {
  46.             // Exit if communication pipe is broken
  47.             if (Client == null)
  48.                 return;
  49.             try
  50.             {
  51.                 // Check for a close application message
  52.                 if (e.String == "Close Application")
  53.                 {
  54.                     // Disconnect Pipe
  55.                     Client.DataReceived -= Client_DataReceived;
  56.                     Client.Close();
  57.                     Client = null;
  58.                     // Close AutoCAD
  59.                     Autodesk.AutoCAD.ApplicationServices.Core.Application.Quit();
  60.                     return;
  61.                 }
  62.                 // Tell server that this is busy
  63.                 Client.WriteString("1");
  64.                 // Get database object
  65.                 AcConsole.DatabaseServices.Database database;
  66.                 database = IO.XmlDeserializeFromString(e.String);
  67.                 // Throw error if it received an invalid database object
  68.                 if (database == null)
  69.                     throw new InvalidDataException("Invalid Database Object");
  70.                 // Create new drawing
  71.                 using Database drawing = new Database(true, true);
  72.                 using (Transaction transaction = drawing.TransactionManager.StartTransaction())
  73.                 {
  74.                     // Convert AcConsole.DatabaseServices.Database to Autodesk.AutoCAD.DatabaseServices.Database
  75.                     database.ToDatabase(drawing, transaction);
  76.                     transaction.Commit();
  77.                 }
  78.                 // Delete file if it exists
  79.                 string filename = database.Filename;
  80.                 if (File.Exists(filename))
  81.                     File.Delete(filename);
  82.                 // Save drawing
  83.                 drawing.SaveAs(filename, DwgVersion.Current);
  84.                 // Tell Server it is not busy.
  85.                 Client.WriteString("0");
  86.             }
  87.             catch (System.Exception ex)
  88.             {
  89.                 // Tell server that an error occured.
  90.                 Client.WriteString(ex.Message);
  91.             }
  92.         }
  93.     }
  94. }

我想如果我使用事件处理程序,当它空闲时,我不会使用任何CPU电源。有人能帮我吗?

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

61

主题

792

帖子

35

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1015
发表于 2021-4-21 11:01:42 | 显示全部楼层
警告:我不擅长C#。这种反应更多的是理论方面的。
使用任务呢?
https://docs . Microsoft . com/en-us/dot net/API/system . threading . tasks . task?redirected from = MSDN & view = net-5.0
回复

使用道具 举报

26

主题

128

帖子

2

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
231
发表于 2021-4-21 13:33:05 | 显示全部楼层
谢谢John的建议,
经过更多的检查,它似乎与重定向控制台Standard IO
  1.         ///
  2.         /// Initializes a new instance of this class
  3.         ///
  4.         public Console()
  5.         {
  6.             try
  7.             {
  8.                 string installpath = null;
  9.                 // Search the directory for the AutoCAD Console Application
  10.                 foreach (string file in Directory.GetFiles(@"C:\Program Files\Autodesk", "accoreconsole.exe", SearchOption.AllDirectories))
  11.                 {
  12.                     if (Path.GetFileName(file).Equals("accoreconsole.exe", StringComparison.OrdinalIgnoreCase))
  13.                     {
  14.                         installpath = file;
  15.                         break;
  16.                     }
  17.                 }
  18.                 // Set up process
  19.                 coreprocess.StartInfo.Arguments = "/isolate";
  20.                 coreprocess.StartInfo.UseShellExecute = false;
  21.                 coreprocess.StartInfo.CreateNoWindow = true;
  22.                 coreprocess.StartInfo.RedirectStandardOutput = false;
  23.                 coreprocess.StartInfo.RedirectStandardInput = true;
  24.                 coreprocess.StartInfo.FileName = installpath;
  25.                
  26.                 // Start Process
  27.                 this.ConsoleStarted = coreprocess.Start();
  28.                 // Load program to AutoCAD Core Console
  29.                 if (this.ConsoleStarted)
  30.                 {
  31.                     // Get program running inside accoreconsole
  32.                     string loadDLL = Directory.GetCurrentDirectory() + "\\AcConsoleIn.dll";
  33.                     using StreamWriter writer = coreprocess.StandardInput;
  34.                     // Set up the IPC pipe connection
  35.                     string guid = Guid.NewGuid().ToString().ToUpper();
  36.                     server = new(guid, p => p.StartStringReaderAsync());
  37.                     server.Connected += Server_Connected;
  38.                     server.DataReceived += Server_DataReceived;
  39.                     // Write to AutoCAD Core Console
  40.                     writer.WriteLine("SECURELOAD 0");
  41.                     writer.WriteLine("NETLOAD " + loadDLL);
  42.                     writer.WriteLine("(PROCESS "" + guid + "") ");
  43.                     writer.Close();
  44.                 }
  45.             }
  46.             catch { }
  47.         }

有关
,如果我注释掉了代码的编写器部分,尽管没有运行任何东西,它仍然以5%的速度运行。但是,如果我更改以下内容:
  1. coreprocess.StartInfo.RedirectStandardInput = false;

它以0%的速度运行。
因此,标准输入的重定向就是这样做的。如何解决此问题?
我需要写入控制台,并且不想运行100%的线程。
回复

使用道具 举报

61

主题

792

帖子

35

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1015
发表于 2021-4-21 13:55:42 | 显示全部楼层
改为从文件中读取文本?我假设“ReDirectStandard ardInput”是键盘输入。
回复

使用道具 举报

26

主题

128

帖子

2

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
231
发表于 2021-4-21 16:15:30 | 显示全部楼层
我找到了。这是这一行:
  1. writer.Close();

显然,当我删除那一行时,它解决了问题。
回复

使用道具 举报

1

主题

7

帖子

3

银币

初来乍到

Rank: 1

铜币
11
发表于 2021-12-7 06:49:05 | 显示全部楼层

你介意分享更多关于这个的信息吗?我会对你的解决方案非常感兴趣
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 01:38 , Processed in 0.150121 second(s), 64 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表