 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Sex Mai 12, 2017 9:08 am Assunto: Montar uma thread arquivo json? |
|
|
Tem como montar um thread deste método aqui? O retorno do post dele esta muito lento 15 a 17 segundos de um arquivo o que trava o sistema por este período, por isso talvez uma thread resolva meu problema.
O método
| Código: | procedure TfrmSincronismo.EnviaDadosVenda(Venda: TVenda = nil);
var
I: Integer;
Controller: TSincronismoController;
ObjetoJson: TJSONObject;
ParametroJson, StringJSON: TStringList;
Resp: TStringStream;
Resposta: String;
Url: String;
IdHTTP: TIdHTTP;
DirJSON: String;
ArquivoJson: TIdMultipartFormDataStream;
VendaController: TVendaController;
TTheadEnvio: TEnvioThread;
begin
try
IdHTTP := TIdHTTP.Create(nil);
ParametroJson := TStringList.Create;
StringJSON := TStringList.Create;
try
Controller := TSincronismoController.Create;
Controller.oVendaAtual := Venda;
Resp := TStringStream.Create('');
with IdHTTP do
begin
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
ReadTimeout := 0;
AllowCookies := True;
ProxyParams.BasicAuthentication := True;
ProxyParams.ProxyPort := 0;
Request.CustomHeaders.Clear;
Request.Clear;
Request.ContentLength := -1;
Request.ContentRangeEnd := 0;
Request.ContentRangeStart := 0;
Request.ContentEncoding := 'multipart/form-data';
Request.CharSet := 'utf-8';
// Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
IdHTTP.Request.UserAgent :=
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
// Adriano
Request.ContentType := 'application/json';
end;
try
Application.ProcessMessages;
TrimAppMemorySize;
ObjetoJson := Controller.MontaJSONEnvio(TB_VENDA,
IfThen(Venda <> nil, Venda.Id, 0));
DirJSON := ExtractFilePath(Application.ExeName) + 'json' +
TB_VENDA + '.txt';
try
DeleteFile(DirJSON);
StringJSON.Clear;
StringJSON.Add(ObjetoJson.ToString);
StringJSON.SaveToFile(DirJSON);
Url := 'https://minhaurl.com.br/SyncControl/web/sync/venda';
ArquivoJson := TIdMultipartFormDataStream.Create;
ArquivoJson.AddFile('json_file', DirJSON, 'text/plain');
IdHTTP.Request.Referer := Url;
try
IdHTTP.Post(Url, ArquivoJson, Resp);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + E.Message);
end;
DeleteFile(DirJSON);
except
// Exceção silenciosa
end;
// ShowMessage(Resp.DataString);
// Resp.LoadFromFile('C:\respostaJson.txt');
Resp.SaveToFile('C:\respostaJson.txt');
TrataJsonRetorno(Resp);
Resp.Clear;
IdHTTP.Disconnect;
finally
try
FreeAndNil(ObjetoJson);
if Venda <> nil then
begin
Venda.Sincronizado := True;
try
VendaController := TVendaController.Create;
VendaController.SetIdWeb(Venda);
finally
FreeAndNil(VendaController);
end;
end;
except
on E: Exception do
begin
// ShowMessage(e.Message);
if ObjetoJson <> nil then
ObjetoJson.Free;
end;
end;
end;
finally
FreeAndNil(Controller);
FreeAndNil(Resp);
FreeAndNil(ParametroJson);
FreeAndNil(StringJSON);
FreeAndNil(IdHTTP);
FreeAndNil(ArquivoJson);
end;
except
on E: Exception do
// ShowMessage(e.Message);
end;
end; |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Sex Mai 12, 2017 2:44 pm Assunto: |
|
|
Tentou utilizar o componente idAntFreeze?
Ele serve justamente para isto, para não congelar a aplicação.
bye _________________ P.O.W.E.R B.Y D.E.L.P.H.I |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Mai 15, 2017 11:34 am Assunto: |
|
|
Uma thread anonima cairia bem em seu caso e não precisaria de muita coisa.
qual versão do delphi estar a usar? _________________ Tudo podemos quando tudo sabemos! |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Mai 15, 2017 11:43 am Assunto: |
|
|
Ficaria algo como isso cá:
| Código: | procedure TfrmSincronismo.EnviaDadosVenda(Venda: TVenda = nil);
var
myThread : TThread;
begin
myThread := TThread.CreateAnonymousThread(
procedure
var
I: Integer;
Controller: TSincronismoController;
ObjetoJson: TJSONObject;
ParametroJson, StringJSON: TStringList;
Resp: TStringStream;
Resposta: String;
Url: String;
IdHTTP: TIdHTTP;
DirJSON: String;
ArquivoJson: TIdMultipartFormDataStream;
VendaController: TVendaController;
TTheadEnvio: TEnvioThread;
begin
try
IdHTTP := TIdHTTP.Create(nil);
ParametroJson := TStringList.Create;
StringJSON := TStringList.Create;
try
Controller := TSincronismoController.Create;
Controller.oVendaAtual := Venda;
Resp := TStringStream.Create('');
with IdHTTP do
begin
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
ReadTimeout := 0;
AllowCookies := True;
ProxyParams.BasicAuthentication := True;
ProxyParams.ProxyPort := 0;
Request.CustomHeaders.Clear;
Request.Clear;
Request.ContentLength := -1;
Request.ContentRangeEnd := 0;
Request.ContentRangeStart := 0;
Request.ContentEncoding := 'multipart/form-data';
Request.CharSet := 'utf-8';
// Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
IdHTTP.Request.UserAgent :=
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
// Adriano
Request.ContentType := 'application/json';
end;
try
Application.ProcessMessages;
TrimAppMemorySize;
ObjetoJson := Controller.MontaJSONEnvio(TB_VENDA,
IfThen(Venda <> nil, Venda.Id, 0));
DirJSON := ExtractFilePath(Application.ExeName) + 'json' +
TB_VENDA + '.txt';
try
DeleteFile(DirJSON);
StringJSON.Clear;
StringJSON.Add(ObjetoJson.ToString);
StringJSON.SaveToFile(DirJSON);
Url := 'https://minhaurl.com.br/SyncControl/web/sync/venda';
ArquivoJson := TIdMultipartFormDataStream.Create;
ArquivoJson.AddFile('json_file', DirJSON, 'text/plain');
IdHTTP.Request.Referer := Url;
try
IdHTTP.Post(Url, ArquivoJson, Resp);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + E.Message);
end;
DeleteFile(DirJSON);
except
// Exceção silenciosa
end;
// ShowMessage(Resp.DataString);
// Resp.LoadFromFile('C:\respostaJson.txt');
Resp.SaveToFile('C:\respostaJson.txt');
TrataJsonRetorno(Resp);
Resp.Clear;
IdHTTP.Disconnect;
finally
try
FreeAndNil(ObjetoJson);
if Venda <> nil then
begin
Venda.Sincronizado := True;
try
VendaController := TVendaController.Create;
VendaController.SetIdWeb(Venda);
finally
FreeAndNil(VendaController);
end;
end;
except
on E: Exception do
begin
// ShowMessage(e.Message);
if ObjetoJson <> nil then
ObjetoJson.Free;
end;
end;
end;
finally
FreeAndNil(Controller);
FreeAndNil(Resp);
FreeAndNil(ParametroJson);
FreeAndNil(StringJSON);
FreeAndNil(IdHTTP);
FreeAndNil(ArquivoJson);
end;
except
on E: Exception do
// ShowMessage(e.Message);
end;
end);
myThread.FreeOnTerminate:=true;
myThread.start;
end; |
_________________ Tudo podemos quando tudo sabemos! |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 15, 2017 11:43 am Assunto: |
|
|
Cheguei a tentar fazer, mais assim não rolou, da erro de access violation
| Código: | { TEnvioThread }
procedure TEnvioThread.Execute;
var
I: Integer;
Controller: TSincronismoController;
ObjetoJson: TJSONObject;
ParametroJson, StringJSON: TStringList;
Resp: TStringStream;
Resposta: String;
Url: String;
IdHTTP: TIdHTTP;
DirJSON: String;
ArquivoJson: TIdMultipartFormDataStream;
VendaController: TVendaController;
TTheadEnvio: TEnvioThread;
Venda: TVenda;
begin
Priority := tpNormal;
with frmSincronismo do
begin
try
IdHTTP := TIdHTTP.Create(nil);
ParametroJson := TStringList.Create;
StringJSON := TStringList.Create;
try
Controller := TSincronismoController.Create;
Controller.oVendaAtual := Venda;
Resp := TStringStream.Create('');
with IdHTTP do
begin
// IOHandler := IdSSLIOHandlerSocketOpenSSL1;
ReadTimeout := 0;
AllowCookies := True;
ProxyParams.BasicAuthentication := True;
ProxyParams.ProxyPort := 0;
Request.CustomHeaders.Clear;
Request.Clear;
Request.ContentLength := -1;
Request.ContentRangeEnd := 0;
Request.ContentRangeStart := 0;
Request.ContentEncoding := 'multipart/form-data';
Request.CharSet := 'utf-8';
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
Request.ContentType := 'application/json';
end;
try
Application.ProcessMessages;
TrimAppMemorySize;
ObjetoJson := Controller.MontaJSONEnvio(TB_VENDA,
IfThen(Venda <> nil, Venda.Id, 0));
DirJSON := ExtractFilePath(Application.ExeName) + 'json' +
TB_VENDA + '.txt';
try
DeleteFile(DirJSON);
StringJSON.Clear;
StringJSON.Add(ObjetoJson.ToString);
StringJSON.SaveToFile(DirJSON);
Url := 'https://minhaurl/sync/venda';
ArquivoJson := TIdMultipartFormDataStream.Create;
ArquivoJson.AddFile('json_file', DirJSON, 'text/plain');
IdHTTP.Request.Referer := Url;
try
IdHTTP.Post(Url, ArquivoJson, Resp);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + E.Message);
end;
DeleteFile(DirJSON);
except
// Exceção silenciosa
end;
// ShowMessage(Resp.DataString);
// Resp.LoadFromFile('C:\respostaJson.txt');
Resp.SaveToFile('C:\respostaJson.txt');
TrataJsonRetorno(Resp);
Resp.Clear;
IdHTTP.Disconnect;
finally
try
FreeAndNil(ObjetoJson);
if Venda <> nil then
begin
Venda.Sincronizado := True;
try
VendaController := TVendaController.Create;
VendaController.SetIdWeb(Venda);
finally
FreeAndNil(VendaController);
end;
end;
except
on E: Exception do
begin
// ShowMessage(e.Message);
if ObjetoJson <> nil then
ObjetoJson.Free;
end;
end;
end;
finally
FreeAndNil(Controller);
FreeAndNil(Resp);
FreeAndNil(ParametroJson);
FreeAndNil(StringJSON);
FreeAndNil(IdHTTP);
FreeAndNil(ArquivoJson);
end;
except
on E: Exception do
ShowMessage(E.Message);
end;
end;
inherited;
end; |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 15, 2017 11:46 am Assunto: |
|
|
| strak2012 escreveu: | Ficaria algo como isso cá:
| Código: | procedure TfrmSincronismo.EnviaDadosVenda(Venda: TVenda = nil);
var
myThread : TThread;
begin
myThread := TThread.CreateAnonymousThread(
procedure
var
I: Integer;
Controller: TSincronismoController;
ObjetoJson: TJSONObject;
ParametroJson, StringJSON: TStringList;
Resp: TStringStream;
Resposta: String;
Url: String;
IdHTTP: TIdHTTP;
DirJSON: String;
ArquivoJson: TIdMultipartFormDataStream;
VendaController: TVendaController;
TTheadEnvio: TEnvioThread;
begin
try
IdHTTP := TIdHTTP.Create(nil);
ParametroJson := TStringList.Create;
StringJSON := TStringList.Create;
try
Controller := TSincronismoController.Create;
Controller.oVendaAtual := Venda;
Resp := TStringStream.Create('');
with IdHTTP do
begin
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
ReadTimeout := 0;
AllowCookies := True;
ProxyParams.BasicAuthentication := True;
ProxyParams.ProxyPort := 0;
Request.CustomHeaders.Clear;
Request.Clear;
Request.ContentLength := -1;
Request.ContentRangeEnd := 0;
Request.ContentRangeStart := 0;
Request.ContentEncoding := 'multipart/form-data';
Request.CharSet := 'utf-8';
// Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
IdHTTP.Request.UserAgent :=
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
// Adriano
Request.ContentType := 'application/json';
end;
try
Application.ProcessMessages;
TrimAppMemorySize;
ObjetoJson := Controller.MontaJSONEnvio(TB_VENDA,
IfThen(Venda <> nil, Venda.Id, 0));
DirJSON := ExtractFilePath(Application.ExeName) + 'json' +
TB_VENDA + '.txt';
try
DeleteFile(DirJSON);
StringJSON.Clear;
StringJSON.Add(ObjetoJson.ToString);
StringJSON.SaveToFile(DirJSON);
Url := 'https://minhaurl.com.br/SyncControl/web/sync/venda';
ArquivoJson := TIdMultipartFormDataStream.Create;
ArquivoJson.AddFile('json_file', DirJSON, 'text/plain');
IdHTTP.Request.Referer := Url;
try
IdHTTP.Post(Url, ArquivoJson, Resp);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + E.Message);
end;
DeleteFile(DirJSON);
except
// Exceção silenciosa
end;
// ShowMessage(Resp.DataString);
// Resp.LoadFromFile('C:\respostaJson.txt');
Resp.SaveToFile('C:\respostaJson.txt');
TrataJsonRetorno(Resp);
Resp.Clear;
IdHTTP.Disconnect;
finally
try
FreeAndNil(ObjetoJson);
if Venda <> nil then
begin
Venda.Sincronizado := True;
try
VendaController := TVendaController.Create;
VendaController.SetIdWeb(Venda);
finally
FreeAndNil(VendaController);
end;
end;
except
on E: Exception do
begin
// ShowMessage(e.Message);
if ObjetoJson <> nil then
ObjetoJson.Free;
end;
end;
end;
finally
FreeAndNil(Controller);
FreeAndNil(Resp);
FreeAndNil(ParametroJson);
FreeAndNil(StringJSON);
FreeAndNil(IdHTTP);
FreeAndNil(ArquivoJson);
end;
except
on E: Exception do
// ShowMessage(e.Message);
end;
end);
myThread.FreeOnTerminate:=true;
myThread.start;
end; |
| Hum vc criou a thread dentro do metodo, não tinha feito assim, vou tentar amigo. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 15, 2017 1:15 pm Assunto: |
|
|
Então fiz o teste, passou na thread sem problema, mais travou aqui no frmFinalizaVenda.ShowModal;
Para chamar a thread
| Código: | procedure TfrmPagamento.SincronizaVenda;
begin
try
try
frmSincronismo := TFrmSincronismo.Create(Self);
frmSincronismo.EnviaDadosVenda(oVendaAtual);
finally
FreeAndNil(frmSincronismo);
end;
except
// Tenta sincronizar, e mantém uma exceção silenciosa, pois se der erro
// a venda apenas fica como não sincronizada.
end;
end; |
| Código: | if not Assigned(frmFinalizaVenda) then
frmFinalizaVenda := TfrmFinalizaVenda.Create(Self);
try
// Verifico se tem internet para sincronizar a venda
if TemInternet then
SincronizaVenda;
frmFinalizaVenda.enumFormQueChamou := tfFormFrenteCaixa;
frmFinalizaVenda.ValorTotalVenda := ValorTotalVenda;
frmFinalizaVenda.ValorTotalDesconto := ValorTotalDesconto;
frmFinalizaVenda.oValorInicialCaixa := oValorInicialCaixa;
frmFinalizaVenda.oVendaAtual := oVendaAtual;
frmFinalizaVenda.oCliente := oCliente;
frmFinalizaVenda.oFuncionario := oFuncionario;
frmFinalizaVenda.ListaVendaItens := ListaVendaItens;
frmFinalizaVenda.ListaPagamentos := ListaPagamentos;
frmFinalizaVenda.Impressora := Impressora;
frmFinalizaVenda.ShowModal;
finally
frmFinalizaVenda.Release;
frmFinalizaVenda := nil;
end; |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 15, 2017 1:23 pm Assunto: |
|
|
| adriano_servitec escreveu: | Então fiz o teste, passou na thread sem problema, mais travou aqui no frmFinalizaVenda.ShowModal;
Para chamar a thread
| Código: | procedure TfrmPagamento.SincronizaVenda;
begin
try
try
frmSincronismo := TFrmSincronismo.Create(Self);
frmSincronismo.EnviaDadosVenda(oVendaAtual);
finally
FreeAndNil(frmSincronismo);
end;
except
// Tenta sincronizar, e mantém uma exceção silenciosa, pois se der erro
// a venda apenas fica como não sincronizada.
end;
end; |
| Código: | if not Assigned(frmFinalizaVenda) then
frmFinalizaVenda := TfrmFinalizaVenda.Create(Self);
try
// Verifico se tem internet para sincronizar a venda
if TemInternet then
SincronizaVenda;
frmFinalizaVenda.enumFormQueChamou := tfFormFrenteCaixa;
frmFinalizaVenda.ValorTotalVenda := ValorTotalVenda;
frmFinalizaVenda.ValorTotalDesconto := ValorTotalDesconto;
frmFinalizaVenda.oValorInicialCaixa := oValorInicialCaixa;
frmFinalizaVenda.oVendaAtual := oVendaAtual;
frmFinalizaVenda.oCliente := oCliente;
frmFinalizaVenda.oFuncionario := oFuncionario;
frmFinalizaVenda.ListaVendaItens := ListaVendaItens;
frmFinalizaVenda.ListaPagamentos := ListaPagamentos;
frmFinalizaVenda.Impressora := Impressora;
frmFinalizaVenda.ShowModal;
finally
frmFinalizaVenda.Release;
frmFinalizaVenda := nil;
end; |
|
Coloquei um try/exception ao executar o frmFinalizaVenda.ShowModal; e retornou de novo access violation, provavelmente o que vem da trheads, como não consegui debugar ela não sei afirmar de onde gera o access violation _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Mai 15, 2017 1:31 pm Assunto: |
|
|
[quote="adriano_servitec"]Então fiz o teste, passou na thread sem problema, mais travou aqui no frmFinalizaVenda.ShowModal;
Para chamar a thread
| Código: | procedure TfrmPagamento.SincronizaVenda;
begin
try
try
frmSincronismo := TFrmSincronismo.Create(Self);
frmSincronismo.EnviaDadosVenda(oVendaAtual); // a thread estar cá neste método
finally
FreeAndNil(frmSincronismo); // a thread cá já deve ter sua finalização concluída para não dá AV, assim melhor usar o freeandnil dentro da própria thread
end;
except
// Tenta sincronizar, e mantém uma exceção silenciosa, pois se der erro
// a venda apenas fica como não sincronizada.
end;
end; |
_________________ Tudo podemos quando tudo sabemos! |
|
| Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Mai 15, 2017 1:34 pm Assunto: |
|
|
Tente desta forma:
| Código: | procedure TfrmPagamento.SincronizaVenda;
begin
try
frmSincronismo := TFrmSincronismo.Create(Self);
frmSincronismo.EnviaDadosVenda(oVendaAtual); // a thread estar cá neste método, o medoto EnviaDadosVenda ja possui o freenandinil para o frmSincronismo
except
// Tenta sincronizar, e mantém uma exceção silenciosa, pois se der erro
// a venda apenas fica como não sincronizada.
end;
end;
procedure TfrmSincronismo.EnviaDadosVenda(Venda: TVenda = nil);
var
myThread : TThread;
begin
myThread := TThread.CreateAnonymousThread(
procedure
var
I: Integer;
Controller: TSincronismoController;
ObjetoJson: TJSONObject;
ParametroJson, StringJSON: TStringList;
Resp: TStringStream;
Resposta: String;
Url: String;
IdHTTP: TIdHTTP;
DirJSON: String;
ArquivoJson: TIdMultipartFormDataStream;
VendaController: TVendaController;
TTheadEnvio: TEnvioThread;
begin
try
IdHTTP := TIdHTTP.Create(nil);
ParametroJson := TStringList.Create;
StringJSON := TStringList.Create;
try
Controller := TSincronismoController.Create;
Controller.oVendaAtual := Venda;
Resp := TStringStream.Create('');
with IdHTTP do
begin
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
ReadTimeout := 0;
AllowCookies := True;
ProxyParams.BasicAuthentication := True;
ProxyParams.ProxyPort := 0;
Request.CustomHeaders.Clear;
Request.Clear;
Request.ContentLength := -1;
Request.ContentRangeEnd := 0;
Request.ContentRangeStart := 0;
Request.ContentEncoding := 'multipart/form-data';
Request.CharSet := 'utf-8';
// Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
IdHTTP.Request.UserAgent :=
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
// Adriano
Request.ContentType := 'application/json';
end;
try
Application.ProcessMessages;
TrimAppMemorySize;
ObjetoJson := Controller.MontaJSONEnvio(TB_VENDA,
IfThen(Venda <> nil, Venda.Id, 0));
DirJSON := ExtractFilePath(Application.ExeName) + 'json' +
TB_VENDA + '.txt';
try
DeleteFile(DirJSON);
StringJSON.Clear;
StringJSON.Add(ObjetoJson.ToString);
StringJSON.SaveToFile(DirJSON);
Url := 'https://minhaurl.com.br/SyncControl/web/sync/venda';
ArquivoJson := TIdMultipartFormDataStream.Create;
ArquivoJson.AddFile('json_file', DirJSON, 'text/plain');
IdHTTP.Request.Referer := Url;
try
IdHTTP.Post(Url, ArquivoJson, Resp);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + E.Message);
end;
DeleteFile(DirJSON);
except
// Exceção silenciosa
end;
// ShowMessage(Resp.DataString);
// Resp.LoadFromFile('C:\respostaJson.txt');
Resp.SaveToFile('C:\respostaJson.txt');
TrataJsonRetorno(Resp);
Resp.Clear;
IdHTTP.Disconnect;
finally
try
FreeAndNil(ObjetoJson);
if Venda <> nil then
begin
Venda.Sincronizado := True;
try
VendaController := TVendaController.Create;
VendaController.SetIdWeb(Venda);
finally
FreeAndNil(VendaController);
end;
end;
except
on E: Exception do
begin
// ShowMessage(e.Message);
if ObjetoJson <> nil then
ObjetoJson.Free;
end;
end;
end;
finally
FreeAndNil(Controller);
FreeAndNil(Resp);
FreeAndNil(ParametroJson);
FreeAndNil(StringJSON);
FreeAndNil(IdHTTP);
FreeAndNil(ArquivoJson);
end;
except
on E: Exception do
// ShowMessage(e.Message);
end;
FreeAndNil(self); // não sei se o self seria visto cá, caso não precisa passar uma referencia valida
end);
myThread.FreeOnTerminate:=true;
myThread.start;
end; |
_________________ Tudo podemos quando tudo sabemos! |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 15, 2017 1:38 pm Assunto: |
|
|
[quote="strak2012"] | adriano_servitec escreveu: | Então fiz o teste, passou na thread sem problema, mais travou aqui no frmFinalizaVenda.ShowModal;
Para chamar a thread
| Código: | procedure TfrmPagamento.SincronizaVenda;
begin
try
try
frmSincronismo := TFrmSincronismo.Create(Self);
frmSincronismo.EnviaDadosVenda(oVendaAtual); // a thread estar cá neste método
finally
FreeAndNil(frmSincronismo); // a thread cá já deve ter sua finalização concluída para não dá AV, assim melhor usar o freeandnil dentro da própria thread
end;
except
// Tenta sincronizar, e mantém uma exceção silenciosa, pois se der erro
// a venda apenas fica como não sincronizada.
end;
end; |
|
Sim esta sendo chamado aqui
| Código: | | frmSincronismo.EnviaDadosVenda(oVendaAtual); // a thread estar cá |
| Citação: | | FreeAndNil(frmSincronismo); // a thread cá já deve ter sua finalização concluída para não dá AV, assim melhor usar o freeandnil dentro da própria thread |
E o que devo fazer então, para chamar o método? _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Mai 15, 2017 1:50 pm Assunto: |
|
|
O frmFinalizaVenda.ShowModal deve ser um metodo tb chamado dentro da thread, ou ao menos deve esperar que a thread seja concluida.
Pense que você pode estar chegando no método frmFinalizaVenda.ShowModal antes mesmo da thread tenha concluida, assim a thread vai tentar manipular coisas que ja não existe mais por conta que o frmFinalizaVenda.ShowModal ja foi chamado antes dando assim o AV. _________________ Tudo podemos quando tudo sabemos! |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 15, 2017 1:58 pm Assunto: |
|
|
| strak2012 escreveu: | O frmFinalizaVenda.ShowModal deve ser um metodo tb chamado dentro da thread, ou ao menos deve esperar que a thread seja concluida.
Pense que você pode estar chegando no método frmFinalizaVenda.ShowModal antes mesmo da thread tenha concluida, assim a thread vai tentar manipular coisas que ja não existe mais por conta que o frmFinalizaVenda.ShowModal ja foi chamado antes dando assim o AV. |
Então eu preciso que este form seja liberado para dar continuidade mesmo que a thread esteja em execução. Se não fico aguardando do mesmo jeito. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|