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 -----
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.
----------------------------------------------------------------------
|