如何在Delphi TCriticalSection上监视等待时间使用Windows工具Indy多线程应用程序进行获取?

问题描述

我有一个带有TDataModule数组的Delphi应用程序,每个TDataModule具有一组IBX组件:TIBDatabase,TIBTransaction,TIBDataSet等。然后在主窗体和每个事件TIdHTTPServer.OnCommant上都有TIdHTTPServer获取事件处理程序代码在DataModule实例上,将其用于数据库操作(与IBX一起使用),准备HTTP答案并释放DataModule实例。

据我了解-然后每个OnCommandGet调用都在单独的线程中处理。而且Delphi应用程序本身当然具有GUI线程。这就是为什么DataModule过程具有带有TCriticalSection的Acquire和Lock的常规代码的原因:

function TBusinessDM.GetIsBusy: Boolean;
begin
  FLock.Acquire; //FLock is instance of TCriticalSection,variable of TBusinessDM
  try
    Result := FIsBusy;
  finally
    FLock.Release;
  end;
end;

这一切都很好,但是我怀疑我的应用程序挂起,存在某种竞争状况。这就是为什么我有一个问题-我该如何测量FLock.Acquire调用Acquire返回之间的时间? 如何监视某种情况确定用于“执行”(基本上等待)Acquire操作的时间的工具??我猜可能在某些情况下,Acquire被调用并且从不返回,仅以暂停应用程序。我还需要检测情况。

当然,对于多线程编程应该非常谨慎,但是有时候,形式验证/合理验证的效率不如实际观察结果

当然是Delphi 2009,IBX,Indy 10.6.2.0和Windows 10。

建议的解决方Windows Administrative Tools - Performance Monitor具有Synchornization和SynchronizationNuma计数器,具有Spinlock获取/秒,Spinlock争用/秒,Spinlock自旋/秒,但仅显示聚合信息(不按进程名称显示)并且肯定不是用Delphi中的批评部分的名字来命名的),并且数字以数千为单位。

这是一个简单的独立程序,它演示了Acquires确实阻止了线程的执行:每次单击都会创建新线程,并且线程会显示简单的主题保存的通用Windows消息。可以看到on可以在Main按钮上单击多次,但是仅显示一条消息,只有在第一个消息确定后,才显示下一条消息。 问题是-如何检测和监视此程序,以监视调用FLock.Acquire之后线程所在的等待时间?

unit MainFormU;

interface

uses
  Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,SyncObjs;

type
  TMainForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TestThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  MainForm: TMainForm;
  FLock: TCriticalSection;

implementation

{$R *.dfm}

procedure TMainForm.Button1Click(Sender: TObject);
begin
  TestThread.Create(False);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FLock:=TCriticalSection.Create;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  FLock.Free;
end;

procedure TestThread.Execute;
begin
  FLock.Acquire;
  try
    Windows.MessageBox(0,PChar('Test Text: '+IntToStr(self.ThreadID)),PChar('Test Caption'),MB_OK);
  finally
    FLock.Release;
  end;
end;

end.

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)