问题描述
我有一个带有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 (将#修改为@)