Subject | Re: [IBO] Multithreaded application problem |
---|---|
Author | Helen Borrie |
Post date | 2004-10-27T04:41:03Z |
Rob,
At 02:16 PM 27/10/2004 +1300, you wrote:
One is your using the Connected property to connect to the database and
providing no exception checking on whether the connection was made. I'd
want to call Connect inside a try...except block and do a really thorough
cleanup if the thread fails to make the connection.
With that in mind, since you have no apparent "exit-and-cleanup" strategy
in the preceding code that is likely to cause the thread owner to terminate
the thread, that "while Terminated = False" loop looks pretty hairy. An
improperly handled exception inside this method (whatever it is) risks
throwing it into an infinite loop, from what I can tell here.
Helen
At 02:16 PM 27/10/2004 +1300, you wrote:
>Hi AllThere are a few of things her that I'm dubious about.
>
>We are having strange problems with a multithreaded application using IBO
>components. This app runs fine on many (dozens) of machines however on
>Newer P4 machines running at 2.8Ghz (may be other higher speeds but thus far
>only 2.8 machines have been tested) and windows XP SP2 we are having
>problems.
>
>The following code is in the execute part of a thread. The code crashes
>(Locks?) when trying to open the increment table. The exception either does
>not trigger or fails to save any message to the error file.
>
>I have traced the code by logging actions to a log. All components are
>created on the fly (No DM used here). TwsTable inherits from TIBOTable.
>The main VCL thread is running simultaneously. The application appears to
>lock, using 100% processor time. It never recovers.
>
>Am I doing something obviously wrong / dangerous? Any suggestions?
>
>
> if (ClientSesion = Nil) then begin
> ClientSesion := TIB_Session.Create(Nil);
>
> ClientSesion.UseCursor := False;
>
> //RM 22/06/2004 Firebird - Create Database for all table components
> IBODataBase := TIBODatabase.Create(ClientSesion);
> IBODataBase.Path := Owner.DataBasefullPath;
> IBODataBase.Password := WS_DB_PASSWORD;
> IBODataBase.Username := WS_DB_USERNAME;
> IBODataBase.Protocol := cpTCP_IP;
> // IBODataBase.PageSize := WS_DB_PAGESIZE;
> IBODataBase.IB_Session := ClientSesion;
> IBODataBase.SQLDialect := 3;
> IBODataBase.Connected := True;
>
> IncrementTable := TwsTable.Create(ClientSesion);
> IncrementTable.IB_Connection := IBODataBase;
> IncrementTable.TableName := 'Increment';
> try
> IncrementTable.OpenIfClosed;
> except
> on e: exception do begin
>RecordServerError('ROB TEST **', 'Processing Thread - 2d', 1, Now,
>e.message); //RM 27/10/2004 Testing
> end;
> end;
> end;
>
> while Terminated = False do begin
> ........
One is your using the Connected property to connect to the database and
providing no exception checking on whether the connection was made. I'd
want to call Connect inside a try...except block and do a really thorough
cleanup if the thread fails to make the connection.
With that in mind, since you have no apparent "exit-and-cleanup" strategy
in the preceding code that is likely to cause the thread owner to terminate
the thread, that "while Terminated = False" loop looks pretty hairy. An
improperly handled exception inside this method (whatever it is) risks
throwing it into an infinite loop, from what I can tell here.
Helen