Hi again,

Thanks for all the help; after close scrutiny of TService sources and help
from David's pages (thanks David), i have found out that the code inside the
timer tick event on a tservice application is not on the same thread as the
code that is put into the servicestart() event; This works with ADO too -
replace myactivexcom with TADOQuery
following is an explanation,

if i have such code on the service start -

begin
    coinitialize(nil);
    myactivexcom:=myactivexcom.createnil);
    timer.enabled:=true;
 end;

and on service stop

begin
    timer.enabled:=false;
    myactivexcom.free;
    counititialize;
end;

then have a timer dropped on the service datamodule and on tick

begin
     myactivexcom.dosomething();
end;

the code in the timer tick; service start and service stop events are run on
different threads; one way round this is to create your thread manually and
maintain it throughout the existance of the service so that

on service start we will have

begin
    tmyactivexthread.create(False);
end;

on service stop we have
begin
  tmyactivexthread.free;
end;

then the thread code can maintain the com subsystem thus be able to
propertly use such components eg.

procedure mythread.execute;
begin
  coinitialize(nil);
  myactivexcom:=tmyactivexcom.create(nil);
  while not terminated do
  begin
    sleep(1000); // to emulate a timer
    myactivexcom.dosomthing;
  end;
  myactivexcom.free;
  couninitialize;
end;

its actually neater - dont you think?

hope it helps anyone doing ado in threads in services
regards,

Chris.

----- Original Message -----
From: "Smith David G (Finance)" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Tuesday, July 05, 2005 4:39 PM
Subject: RE: [delphi-en] Borland ADO and Threads


> Take a look at items 3 & 4 here:
> http://www.techvanguards.com/com/tutorials/tips.asp
>
> David
>
>
> -----Original Message-----
> From: [email protected] [mailto:[EMAIL PROTECTED] On
> Behalf Of Chris @ IT
> Sent: Tuesday, July 05, 2005 8:58 AM
> To: [email protected]
> Subject: Re: [delphi-en] Borland ADO and Threads
>
> The error message is...
>
> "The application called an interface that was marshalled for a different
> thread"
>
> I have also tried to use your method of creating and using objects;
> frankly ive found out using the with clause and using a variable to
> create and access object properties and methods are the same ie.
>
> /////////////
>
> with TSMSSender.Create(nil) do
> begin
>   ConnectTo(...);
>   SendMessage(...);
>   Free;
> end;
> ///////////
> and
> ///////////////
>
> var
>   SMSSender : TSMSSender;
> begin
>   SMSSender:=TSMSSender.Create(nil);
>   SMSSender.ConnectTo(...);
>   SMSSender.SendMessage(...);
>   SMSSender.Free;
> end;
>
> /////////
>
> are the same.
>
> I know the problem lies somewhere with activex/com objects and threads;
> i just cant put my fingure on it...
>
> Thanks anyway,
>
> Chris.
> ----- Original Message -----
> From: "Vahan Yoghoudjian" <[EMAIL PROTECTED]>
> To: <[email protected]>
> Sent: Tuesday, July 05, 2005 4:32 PM
> Subject: RE: [delphi-en] Borland ADO and Threads
>
>
> >     what is the error message?
> >
> >     I have never used TComponentType.Create(nil) in a with clause... I
> don't
> > know but this might be it, can you try to avoid it? or maybe it's the
> > nil parameter that you are passing to the constructor... can you try
> application
> > for example?
> >
> >     The error message would help us more to find out the source of
> > your problem
> >
> > Cheers
> > Vahan
> >
> > -----Original Message-----
> > From: [email protected] [mailto:[EMAIL PROTECTED]
> Behalf
> > Of Chris @ IT
> > Sent: Tuesday, July 05, 2005 2:23 PM
> > To: [email protected]
> > Subject: [delphi-en] Borland ADO and Threads
> >
> >
> > Hi all,
> >
> > Im having a slight problem here; probably missing something small.
> > I have an application that recieves sms messages from an smpp server
> > then spins of a thread that goes ahead to insert into a database.
> > Reason for
> this
> > is that i need to free my application as soon as possible to receive
> > the next smpp message coming in.
> >
> > This works all well and good - i ensured that i call coinitialize and
> > couninitialize for each thread (so that i can use com objects
> (TADOCommand))
> >
> > The problem comes when i drop a timer and on each timer tick i cannot
> create
> > any kind of com/activex object (ado etc etc) if i try i get the
> > following error
> >
> > The application called an interface that was marshalled for a
> > different thread
> >
> > below are snips of the code
> >
> > - for the thread execute method itself
> >
> > procedure Tinsert.Execute;
> > begin
> >   { Place thread code here }
> >   Coinitialize(nil);
> >
> >   with TADOCOmmand.Create(nil) do
> >   begin
> >     ConnectionString:='Provider=SQLOLEDB.1;Password=kiokor$7;Persist
> > Security Info=True;User ID=sa;Initial Catalog=smsgate';
> >
> >     CommandText:='insert into tblincoming
> >
> (Message_Destination,Message_Source,Message_Text,Message_Option,Message_
> SMSC
> > TimeStamp,Message_Validity) values ('+
> >       QuotedStr(f_bstrDestination)+','+
> >       QuotedStr(f_bstrOriginator)+','+
> >       QuotedStr(f_bstrMessage)+','+
> >       IntToStr(f_lOption)+','+
> >       QuotedStr(FormatDateTime('dd mmm yyyy
> HH:nn:ss',f_SMSCTimeStamp))+','+
> >       QuotedStr(FormatDateTime('dd mmm yyyy
> > HH:nn:ss',f_Validity))+')';
> >
> >     Execute;
> >     Free;
> >   end;
> >
> >   CoUninitialize;
> > end;
> >
> > - and for the timer method - smpp send
> >
> > procedure TsSMPP.TimerTimer(Sender: TObject); begin
> >
> >   with TADOQUery.Create(nil) do
> >   begin
> >     ConnectionString:='Provider=SQLOLEDB.1;Password=kiokor$7;Persist
> > Security Info=True;User ID=sa;Initial Catalog=smsgate';
> >     SQL.TexT:='select * from tbloutgoing where Message_MTDelivered=0';
> >
> >     Open;
> >     while not EOF do
> >     begin
> >       SMPP.SMSCSubmitMessage(
> >         FieldByName('Message_Destination').AsString,
> >         FieldByName('Message_Source').AsString,
> >         FieldByName('Message_Option').AsInteger,
> >         FieldByName('Message_SourceTON').AsInteger,
> >         FieldByName('Message_SourceNPI').AsInteger,
> >         FieldByName('Message_DestTON').AsInteger,
> >         FieldByName('Message_DestNPI').AsInteger,
> >         FieldByName('Message_Text').AsString,
> >         Now,
> >         FieldByName('Message_Validity').AsInteger);
> >
> >       Edit;
> >       FieldByName('Message_MTDelivered').AsBoolean:=True;
> >       Post;
> >       Next;
> >     end;
> >     Close;
> >   end;
> >
> > end;
> >
> > the error occurs on the timer send as soon as the ado querry is
> > created
> >
> > any help would be appreciated.
> >
> > regards
> >
> > Chris.
> >
> >
> >
> > -----------------------------------------------------
> > Home page: http://groups.yahoo.com/group/delphi-en/
> > To unsubscribe: [EMAIL PROTECTED]
> >
> >
> >
> > ----------------------------------------------------------------------
> > ----
> --
> > ----
> > YAHOO! GROUPS LINKS
> >
> >   a..  Visit your group "delphi-en" on the web.
> >
> >   b..  To unsubscribe from this group, send an email to:
> >    [EMAIL PROTECTED]
> >
> >   c..  Your use of Yahoo! Groups is subject to the Yahoo! Terms of
> Service.
> >
> >
> > ----------------------------------------------------------------------
> > ----
> --
> > ----
> >
> >
> >
> >
> > [Non-text portions of this message have been removed]
> >
> >
> >
> > -----------------------------------------------------
> > Home page: http://groups.yahoo.com/group/delphi-en/
> > To unsubscribe: [EMAIL PROTECTED]
> > Yahoo! Groups Links
> >
> >
> >
> >
> >
> >
> >
>
>
>
> -----------------------------------------------------
> Home page: http://groups.yahoo.com/group/delphi-en/
> To unsubscribe: [EMAIL PROTECTED]
> Yahoo! Groups Links
>
>
>
>
>
>
>
> -----------------------------------------------------
> Home page: http://groups.yahoo.com/group/delphi-en/
> To unsubscribe: [EMAIL PROTECTED]
> Yahoo! Groups Links
>
>
>
>
>
>
>



-----------------------------------------------------
Home page: http://groups.yahoo.com/group/delphi-en/
To unsubscribe: [EMAIL PROTECTED] 
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/delphi-en/

<*> To unsubscribe from this group, send an email to:
    [EMAIL PROTECTED]

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/
 


Reply via email to