1

Delphi 2006 を使用。私の目的は、TSQLConnection インスタンスがアイドル状態かどうかを確認することです。したがって、アクティビティが表示されるたびに Datetime "m_dLastActivity" を "now" に設定しています。

TSQLMonitor はトレース処理にバグがあり、メモリの問題を引き起こすため ( http://qc.embarcadero.com/wc/qcmain.aspx?d=89216を参照)、SetTraceCallbackEvent を使用して独自のトレース コールバックを登録しようとしています。

procedure TConnectionGuard.SetSQLConnection(const Value: TSQLConnection);
begin
   ...    
   if Assigned ( Value )
   and not ( csDesigning in ComponentState ) then begin
      ...
      m_SQLConnection.SetTraceCallbackEvent(U_ConnectionGuard.OnTraceCallBack, integer(self));
      ...
   end;
end;

コールバックは、データを登録した TConnectionGuard オブジェクトにデータを返すだけです。

function OnTraceCallBack( CallType: TRACECat; CBInfo: Pointer): CBRType; stdcall;
var Desc: pSQLTraceDesc;
begin
   Desc := pSQLTraceDesc(CBInfo);
   Result := TConnectionGuard(Desc.ClientData).OnTraceCallBack(CallType, CBInfo);
end;

イベント自体:

function TConnectionGuard.OnTraceCallBack(CallType: TRACECat; Desc: pSQLTraceDesc): CBRType;
begin
   m_dLastActivity := now;
   Result := cbrUSEDEF;
end;

これまでのところ、うまく機能しています。しかし、パフォーマンスへの影響を最小限に抑えるために、CBRType の結果 (DBCommonTypes.pas で定義) として何を返す必要があるのか​​ わからないという事実に非常に不快です。実際、指定されたパラメーター CallCAT がそれを読み取る/処理する方法のヒントを提供しないため、私は何に答えているのかわかりません。

cbrUSEDEF が最小限のトレースを行うのに適切かどうかは誰にもわかりませんか?

EDIT : TSQLMonitor のソース コードから、指定された CBInfo ポインターは登録したクライアント情報ではなく、クライアント情報 (この場合は Guard へのポインター) を含む psQLTraceDesc であることがわかりました。私はその事実に方法を適応させました...

4

0 に答える 0