小编kli*_*ing的帖子

Delphi中的"本地"指令

我坐在调试一些代码,我在SysUtils.pas中偶然发现了这一行:

procedure ConvertError(ResString: PResStringRec); local;
Run Code Online (Sandbox Code Playgroud)

local关键字到底做了什么?似乎ConvertError函数没有在文件的接口部分声明,这只是澄清该函数确实是本地的,或者使用此指令除此之外是否有实际好处?

delphi

20
推荐指数
1
解决办法
384
查看次数

Delphi中一个和多个"类型"块之间的区别

我一直在为Delphi编程五六年,我认为自己相当擅长,但我最近偶然发现了一个我无法解释的行为.我正在编写一个简单的链表,我们称之为TIntegerList.下面的示例代码正确编译:

type
  PIntegerValue = ^TIntegerValue;

  TIntegerValue = record
    Value: Integer;
    Next: PIntegerValue;
    Prev: PIntegerValue;
  end;
Run Code Online (Sandbox Code Playgroud)

但是,下面的代码没有(说TIntegerValue未声明):

type
  PIntegerValue = ^TIntegerValue;

type  
  TIntegerValue = record
    Value: Integer;
    Next: PIntegerValue;
    Prev: PIntegerValue;
  end;
Run Code Online (Sandbox Code Playgroud)

Delphi中"type"关键字究竟是如何处理的?与在每个类型中使用一个"类型"相比,在一个"type"关键字下声明多个类型的语法含义是什么?好吧,这令人困惑,但我希望代码示例有助于解释我的意思.我在Delphi 2007工作.

delphi syntax compilation delphi-2007

6
推荐指数
1
解决办法
317
查看次数

相同的代码作为Windows服务运行速度比GUI应用程序慢

我有一些Delphi 2007代码,它运行在两个不同的应用程序中,一个是GUI应用程序,另一个是Windows服务.奇怪的是,虽然GUI应用程序在技术上似乎有更多的"待办事项",绘制GUI,计算一些统计数据等,但Windows服务在运行时始终使用更多的CPU.在GUI应用程序使用大约3-4%的CPU功率的情况下,该服务的使用范围为6-8%.

当它们一起运行时,两个应用程序的CPU负载大约加倍.

除了在Windows窗体应用程序中添加GUI代码外,两个应用程序中的基本代码相同.

这种行为有什么理由吗?Windows服务应用程序是否具有某种固有的开销,或者我是否需要查看代码以查找我的书中出现的意外行为?

编辑:

有时间仔细查看代码,我认为下面的建议是GUI应用程序花费一些时间等待重新绘制,导致CPU负载下降可能是不正确的.应用程序都是线程化的,这意味着GUI重新绘制不应影响CPU负载.

为了确保我首先尝试从应用程序中删除所有GUI组件,只留下一个空白表单.这并没有增加程序的CPU负载.然后我经历了在用于更新UI的工作线程中删除所有对Synchronize的调用.这有相同的结果:CPU负载没有变化.

服务中的代码如下所示:

procedure TLsOpcServer.ServiceExecute(Sender: TService);
begin
  // Initialize OPC server as NT Service
  dmEngine.AddToLog( sevInfo, 'Service', 'Name', Sender.Name );
  AddLocalServiceKeysToRegistry( Sender.Name );

  dmEngine.AddToLog( sevInfo, 'Service', 'Execute', 'Started' );
  dmEngine.Start( True );
  //
  while not Terminated do
  begin
    ServiceThread.ProcessRequests( True );
  end;

  dmEngine.Stop;
  dmEngine.AddToLog( sevInfo, 'Service', 'Execute', 'Stopped' );
end;
Run Code Online (Sandbox Code Playgroud)

dmEngine.Start将启动并注册OPC服务器并初始化套接字.然后它启动一个线程,它对输入的OPC信号有所帮助.在GUI应用程序的主要表单上的FormCreate中进行相同的完全调用.

我将研究GUI应用程序如何启动,我没有编写这段代码,所以试图弄清楚它是如何工作的有点冒险:)

EDIT2

这有点有趣.我运行两个应用程序各1分钟,运行AQTime来对它们进行基准测试.这是结果中最有趣的部分:

在服务中:

过程名称: TSignalList :: HandleChild

执行时间: 20.105963821084

Hitcount: 5961231

在GUI应用程序中:

过程名称: TSignalList :: HandleChild

执行时间: 7.62424101324976

命中数: 6383010

编辑3:

我终于回到了能够继续关注这个问题的位置.我发现两个程序在五分钟运行期间都具有大约相同的hitcount,但在服务中执行时间要高得多.对于HandleValue,hitcount为4 …

windows delphi performance windows-services delphi-2007

2
推荐指数
1
解决办法
1784
查看次数