Thread + WebService
Veja o Seguinte código:
Código:
//Implementação do método Execute da Thread.
Código:
A maneira Acima não funciona, porque retorna o seguinte erro:
Código:
Entretando mesmo código dentro de uma evento de button, ou uma procedure invocada pela [ Synchronize ] da Thread funciona perfeitamente.
Gostaria de entender o motivo do erro mencionado acima.
Não consigo entender o porque ocorre o erro somente quando a função do webService é invocada dentro do execute da thread, pois quando a mesma função é chamada em outro lugar funciona perfeitamente. Agradeço.
Código:
TCarregaDados = Class(TThread)
protected
procedure Execute;Override;
private
FdadosEmp: WebServiceType;
procedure msgAlerta;
procedure SetdadosEmp(const Value: WebServiceType
public
property dadosEmp : WebServiceType read FdadosEmp write SetdadosEmp;
constructor create;
End;
//Implementação do método Execute da Thread.
Código:
procedure TCarregaDados.Execute;
var HTTPRIOX: THTTPRIO;
retorno : String;
begin
inherited;
Priority := tpNormal;
HTTPRIOX := THTTPRIO.Create(nil);
HTTPRIOX.URL := 'http://www.empteste.com.br/ws/srvWebService.php';
HTTPRIOX.WSDLLocation := 'http://www.empteste.com.br/ws/srvWebService.php?wsdl';
HTTPRIOX.Service := 'WebServiceempteste';
HTTPRIOX.Port := 'WebServiceemptestePort';
//dadosEmp := GetWebServicePortType(true,'',HTTPRIOX);
//retorno := dadosEmp.getDadosEmpresaAcesso('7512345',0,'51fas3df5asdf');
retorno := (HTTPRIOX as WebServiceIntelectoPortType).getDadosEmpresaAcesso('7512345',0,'51fas3df5asdf');
end;
A maneira Acima não funciona, porque retorna o seguinte erro:
Código:
raised exception class DOMException with message 'Microsoft MSXML is not installed'
Entretando mesmo código dentro de uma evento de button, ou uma procedure invocada pela [ Synchronize ] da Thread funciona perfeitamente.
Gostaria de entender o motivo do erro mencionado acima.
Não consigo entender o porque ocorre o erro somente quando a função do webService é invocada dentro do execute da thread, pois quando a mesma função é chamada em outro lugar funciona perfeitamente. Agradeço.
Hudson Leite
Curtidas 0
Melhor post
Rodolpho Silva
13/06/2013
Vê se isso vai funcionar....
unit ActiveX ... try CoInitialize(nil); Priority := tpNormal; HTTPRIOX := THTTPRIO.Create(nil); ..... Finally CoUninitialize; end;
GOSTEI 4
Mais Respostas
Hudson Leite
13/06/2013
Rodolpho123, Obrigado!
CoInitialize(nil);
Funcionou perfeitamente.
CoInitialize(nil);
Funcionou perfeitamente.
GOSTEI 1
Rodolpho Silva
13/06/2013
Esse problema acontece porque nas execuções em threads onde alguma rotina usa algum tipo de controle ActiveX (no webservice, o XMLDocument usa o MSXML da Microsoft para fazer o parser do XML) os objetos COM não são explicitamente inicializados.
GOSTEI 1
Hudson Leite
13/06/2013
Post Concluído!
GOSTEI 0
Hudson Leite
13/06/2013
CONCLUÍDO
GOSTEI 0