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/