R,

Sorry. Part II. Is a TSession still necessary even though the thread and the application have their own TDatabase components and inherently their own Session?

At 15:50 08/10/2001 +1300, you wrote:
I have no idea about how MIDAS works but you definately need to use a seperate session with each thread when working with DBase etc.  As to BDE crashes, me too!  Any app that crashes the BDE will crash any other app using the BDE in my experiance.
 
Robert Martin
Software Engineer
Wild Software Ltd
----- Original Message -----
From: Donovan J. Edye
To: Multiple recipients of list delphi
Sent: Monday, October 08, 2001 2:49 PM
Subject: [DUG]: [Q] MIDAS (Socket Connection), BDE, Threads

G'Day All,

I have the following:

- A component TCricketLiveScoringClient that uses a MIDAS socket connection to make and handle a connection to a MIDAS server
- The above component uses a TTXProcessThread to monitor changes in a local BDE table
- When a change is detected by the it uses TCricketLiveScoringClient.ProcessTX() to send the transaction to the MIDAS server

However what I am finding is that if an exception is raised and the thread terminated and the connection to the MIDAS server closed that the application dies horribly with access violation(s), runtime error 216 etc. So my questions are these:

- The thread uses its own TDatabase connection (and not the TDatabase connection of the application that contains the component). But does it require a TSession component as well? Are there issues here to do with the BDE/Threading?
- It appears to me that the AppServer property of the TSocketConnection "disappears" out from under me. However no amount of:

      if not ((VarIsNull(FSocketConnection.AppServer)) AND (varEmpty = VarType(FSocketConnection.AppServer)) AND
         (varNull = VarType(FSocketConnection.AppServer))) then
seems to protect me from getting the access violation.

Can anybody provide me with some pointers etc.? Below find the necessary code, but if you need anything else then please ask. I am at a loss as to how to solve this. Environment is D5.01 Enterprise.

TIA


type
   TNewTXDataEvent = procedure(ATXID : integer; ATXPayload : string; TotalTXs : integer;
      var EventCompleted : boolean; var EventCompletedSuccessfully : boolean) of object;

   TTXProcessThread = class(TThread)
   private
      FDatabase : TDataBase;
      FEventCompleted : boolean;
      FEventCompletedSuccessfully : boolean;
      FLastTxIDProcessed : integer;
      //FSession : TSession;
      FTXTable : TTable;
      FNewTXDataEvent : TNewTXDataEvent;
   protected
      procedure Execute; override;
      procedure FireCallBackEvent;
   public
      constructor Create(CreateSuspended : Boolean; ADBPath : string;
         AStartTXID : integer; ANewTXData : TNewTXDataEvent);
      destructor Destroy; override;
   end;

type
   TCricketLiveScoringClient = class(TCustomPanel)
   private
      FActive : boolean;
      FCricketAppGUID : string;
      FGlobalMatchCode : string;
      FLastTXProcessed : integer;
      FSocketConnection : TSocketConnection;
      FStatusPanel : TPanel;
      FTXPanel : TPanel;
      FMessages : TStringList;
      FTXProcessingThread : TTXProcessThread;
      FClientIP : string;
      FDBPath : string;
      FLoggedIn : boolean;
      FMidasServerPort : SmallInt;
      FMidasServerAddress : string;
      procedure AddMessage(AMsg : string);
      procedure CustomOnDblClick(Sender : TObject);
      function Get_Local_IPAddr : string;
      procedure HandleExceptionError(AProcName, AErr, ADelphiError : string);
      function Login : boolean;
      function Logout : boolean;
      procedure NewDataEvent(ATXID : integer; ATXPayload : string; TotalTXs : integer;
         var EventCompleted : boolean; var EventCompletedSuccessfully : boolean);
      function ProcessTX(AGlobalMatchCode : string; ATXID : Integer;
         const ATXPayload : string; var ANextTXID : Integer;
         var ASQLServerErrroCode : integer; var ASQLServerErrorDesc : string) : WordBool;
      procedure SetActive(const Value : boolean);
      procedure SetGlobalMatchCode(const Value : string);
      procedure SetMidasServerAddress(const Value : string);
      procedure SetMidasServerPort(const Value : SmallInt);
   protected

   public
      constructor Create(AOwner : TComponent); override;
      destructor Destroy; override;
   published
      property Active : boolean read FActive write SetActive;
      property Align;
      property BevelInner;
      property BevelOuter;
      property CricketAppGUID : string read FCricketAppGUID write FCricketAppGUID;
      property GlobalMatchCode : string read FGlobalMatchCode write SetGlobalMatchCode;
      property DBPath : string read FDBPath write FDBPath;
      property MidasServerAddress : string read FMidasServerAddress write SetMidasServerAddress;
      property MidasServerPort : SmallInt read FMidasServerPort write SetMidasServerPort;
   end;


function TCricketLiveScoringClient.ProcessTX(AGlobalMatchCode : string; ATXID : Integer;
   const ATXPayload : string; var ANextTXID : Integer;
   var ASQLServerErrroCode : integer; var ASQLServerErrorDesc : string) : WordBool;
////////////////////////////////////////////////////////////////////////////////
// PURPOSE: Processes the supplied TX information
const
   PROC_NAME = 'TCricketLiveScoringClient.ProcessTX';
   ERR_MSG = 'I was unable to process the transaction.';
begin
   //Show failure at this point
   result := FALSE;
   try
      if not ((VarIsNull(FSocketConnection.AppServer)) AND (varEmpty = VarType(FSocketConnection.AppServer)) AND
         (varNull = VarType(FSocketConnection.AppServer))) then
      begin
         if FSocketConnection.AppServer.ProcessTX(FClientIP, FCricketAppGUID, AGlobalMatchCode, ATXID,
            ATXPayload, ANextTXID, ASQLServerErrroCode, ASQLServerErrorDesc) = WordBool(TRUE) then
         begin
            result := TRUE;
            FLastTXProcessed := ANextTXID - 1;
         end;
      end;
   except
      on E : Exception do
         HandleExceptionError(PROC_NAME, ERR_MSG, E.Message);
   end;
end;


-- Donovan
----------------------------------------------------------------------
Donovan J. Edye [
www.edye.wattle.id.au]
Namadgi Systems [
www.namsys.com.au]
Voice: +61 2 6285-3460
Fax: +61 2 6285-3459
TVisualBasic = Class(None);
Heard just before the 'Big Bang': "...Uh Oh...."
----------------------------------------------------------------------
GXExplorer [
http://www.gxexplorer.org] Freeware Windows Explorer
replacement. Also includes freeware delphi windows explorer components.
----------------------------------------------------------------------

-- Donovan
----------------------------------------------------------------------
Donovan J. Edye [
www.edye.wattle.id.au]
Namadgi Systems [
www.namsys.com.au]
Voice: +61 2 6285-3460
Fax: +61 2 6285-3459
TVisualBasic = Class(None);
Heard just before the 'Big Bang': "...Uh Oh...."
----------------------------------------------------------------------
GXExplorer [
http://www.gxexplorer.org] Freeware Windows Explorer
replacement. Also includes freeware delphi windows explorer components.
----------------------------------------------------------------------

Reply via email to